He estado luchando para poner en funcionamiento una imagen de Docker en Windows 10 Home, usando Docker Toolbox. Aquí está el error que veo en Kitematic:
python: can't open file 'src/__main__.py': [Errno 2]
No such file or directory
Este comando de Python que falla es el punto de entrada para el contenedor Docker de 'notas'.
Después de Docker/up.sh, el proceso finaliza sin errores.
Successfully built f59c275721cf
Successfully tagged docker_mysql:latest
Creating mysql ... done
Creating notes ... done
Además, este es un proyecto grupal en el que otros usuarios de Mac no pueden duplicar este error. Después de actualizar Dockerfile a continuación y ejecutar:
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
Archivo Docker actualizado:
### 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"]
Ahora recibo otro error:
* 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
Respuesta1
Mi primer comentario que permitió que comenzara el proceso fue:
No necesita mkdir, ya que WORKDIR lo creará. También es mejor utilizar referencias absolutas, como
WORKDIR /app
yCMD ["python", "/app/src/__main__.py"]
.
El script de Python ahora inicia y detiene el error:
File "/usr/local/lib/python2.7/subprocess.py", line 1047, in _execute_child
raise child_exception
Suele ser un error en el script de Python. Una posibilidad se describe en la publicación. Python subprocess.call() no funciona como se esperaba:
De forma predeterminada,
subprocess.call
no se utiliza un shell para ejecutar nuestros comandos, por lo que no se pueden ejecutar comandos comocd
.Para usar un shell para ejecutar sus comandos, utilícelo
shell=True
como parámetro. En ese caso, se recomienda pasar los comandos como una sola cadena en lugar de una lista. Y como se ejecuta mediante un shell,~/
también puedes usarlo en tu ruta:subprocess.call("(cd ~/catkin_ws/src && catkin_make)", shell=True)