Ich habe Probleme, mithilfe der Docker Toolbox ein Docker-Image unter Windows 10 Home zum Laufen zu bringen. Hier ist der Fehler, den ich in Kitematic sehe:
python: can't open file 'src/__main__.py': [Errno 2]
No such file or directory
Dieser fehlgeschlagene Python-Befehl ist der Einstiegspunkt für den Docker-Container „Notes“.
Nach Docker/up.sh wird der Vorgang ohne Fehler abgeschlossen.
Successfully built f59c275721cf
Successfully tagged docker_mysql:latest
Creating mysql ... done
Creating notes ... done
Darüber hinaus handelt es sich um ein Gruppenprojekt, bei dem andere Benutzer auf Macs diesen Fehler nicht reproduzieren können. Nachdem Sie Dockerfile wie folgt aktualisiert und Folgendes ausgeführt haben:
Successfully built 42a95cd419f2
Successfully tagged docker_mysql:latest
Creating mysql ... done
Creating notes ... done
User@DESKTOP-EBUI9GE MINGW64 /c/users/user/Desktop/6440/Procedure-Notes-Application (master)
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
68f60fdba6f5 docker_mysql "docker-entrypoint.s…" 15 seconds ago Up 9 seconds 0.0.0.0:23306->3306/tcp mysql
User@DESKTOP-EBUI9GE MINGW64 /c/users/user/Desktop/6440/Procedure-Notes-Application (master)
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7fbd5b73189 docker_notes "python /app/src/__m…" 23 seconds ago Exited (2) 17 seconds ago notes
68f60fdba6f5 docker_mysql "docker-entrypoint.s…" 23 seconds ago Up 17 seconds 0.0.0.0:23306->3306/tcp mysql
Aktualisiertes Dockerfile:
### Use an official Python runtime as a parent image
FROM python:2.7-slim
### set working directory to the code location
WORKDIR /app
### copy the code base over (redone by the compose file)
COPY . .
### Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
### Make port available to the world outside this container
EXPOSE 5000
### start the application
CMD ["python", "/app/src/__main__.py"]
Ich erhalte jetzt einen weiteren Fehler:
* Serving Flask app "__main__" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
Traceback (most recent call last):
File "/app/src/__main__.py", line 57, in <module>
app.run(debug=True, host='0.0.0.0')
File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 943, in run
run_simple(host, port, self, **options)
File "/usr/local/lib/python2.7/site-packages/werkzeug/serving.py", line 988, in run_simple
run_with_reloader(inner, extra_files, reloader_interval, reloader_type)
File "/usr/local/lib/python2.7/site-packages/werkzeug/_reloader.py", line 332, in run_with_reloader
sys.exit(reloader.restart_with_reloader())
File "/usr/local/lib/python2.7/site-packages/werkzeug/_reloader.py", line 176, in restart_with_reloader
exit_code = subprocess.call(args, env=new_environ, close_fds=False)
File "/usr/local/lib/python2.7/subprocess.py", line 172, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/local/lib/python2.7/subprocess.py", line 394, in __init__
errread, errwrite)
File "/usr/local/lib/python2.7/subprocess.py", line 1047, in _execute_child
raise child_exception
OSError: [Errno 8] Exec format error
Antwort1
Meine erste Bemerkung, die den Prozess in Gang setzte, war:
Sie benötigen mkdir nicht, da es von WORKDIR erstellt wird. Es ist auch besser, absolute Referenzen wie
WORKDIR /app
und zu verwendenCMD ["python", "/app/src/__main__.py"]
.
Nun startet das Python-Skript und stoppt den Fehler:
File "/usr/local/lib/python2.7/subprocess.py", line 1047, in _execute_child
raise child_exception
Dies ist normalerweise ein Fehler im Python-Skript. Eine Möglichkeit wird im Beitrag beschrieben Python subprocess.call() funktioniert nicht wie erwartet:
Standardmäßig
subprocess.call
wird zum Ausführen unserer Befehle keine Shell verwendet, daher können Sie keine Shell-Befehle wie ausführencd
.Um eine Shell zum Ausführen Ihrer Befehle zu verwenden, verwenden Sie
shell=True
als Parameter. In diesem Fall wird empfohlen, Ihre Befehle als einzelne Zeichenfolge und nicht als Liste zu übergeben. Und da es von einer Shell ausgeführt wird, können Sie~/
auch in Ihrem Pfad Folgendes verwenden:subprocess.call("(cd ~/catkin_ws/src && catkin_make)", shell=True)