Soy nuevo en Docker y estoy tratando de dockerizar un microservicio de matraz de Python. El archivo docker se compila correctamente, pero al ejecutar el contenedor da un error:
python3: can't open file 'flask': [Errno 2] No such file or directorySupongo que hay algún error en mi archivo docker, ya sea en la ruta COPY, ENTRYPOINT o CMD, es decir, los comandos que uso para ejecutar la aplicación del matraz. No soy capaz de averiguar el error.
La estructura de directorios en la máquina Ubuntu es:
/home/ubuntu/Docker/authEl directorio auth contiene mi Dockerfile y todos los demás archivos de matraz de Python:
$ls Dockerfile run.py views.py resources.py models.pyrun.py es el archivo matraz principal de Python para su ejecución. Estoy seguro de que hay algún error de sintaxis en la forma en que ejecuto el comando CMD para la aplicación del matraz y no puedo encontrar run.py para su ejecución. No puedo corregir ese error.
La imagen se construye con éxito. Para ejecutar el contenedor que uso:
docker build <imageid>Dockerfile
FROM ubuntu:16.04 MAINTAINER xyz <xyz@yahoo.com> RUN apt-get update \ && apt-get install -y software-properties-common vim \ && add-apt-repository ppa:jonathonf/python-3.6 \ && apt-get update -y \ && apt-get install -y build-essential python3.6 python3.6-dev python3-pip python3.6-venv \ && pip3 install --upgrade pip WORKDIR /auth COPY . /auth RUN pip3 install alembic==0.9.9 \ && pip3 install Flask==1.0.2 \ ENTRYPOINT [ "python3" ] CMD [ "export","FLASK_APP=run.py" ] CMD [ "set", "FLASK_APP=run.py" ] CMD [ "flask", "run", "--host=0.0.0.0" ]Esperado: la aplicación debería ejecutarse en el contenedor. Real: Python3: no se puede abrir el archivo 'flask': [Errno 2] No existe tal archivo o directorio
El mejor uso para ENTRYPOINT es establecer el comando principal de la imagen, permitiendo que esa imagen se ejecute como si fuera ese comando (y luego usar CMD como indicadores predeterminados).
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#entrypoint
mucha gente parece pasar por alto este punto sobre las ENTRYPOINT y CMD Dockerfile.
se supone que la instrucción ENTRYPOINT ejecuta algún ejecutable, que debería ejecutarse cada vez que inicia el contenedor, como iniciar su servidor.
Se supone que el CMD debe incluir las banderas proporcionadas a ese ejecutable, por lo que pueden anularse fácilmente al ejecutar el contenedor.
No estoy seguro de que debas tener más de una instrucción CMD . si necesita ejecutar comandos durante el proceso de compilación, puede usar la instrucción RUN , por ejemplo:
RUN mkdir some/dirahora:
run.py es el archivo matraz principal de Python para la ejecución
por lo tanto, le sugiero que lo defina como su punto de entrada:
ENTRYPOINT [ "./run.py" ] comandos que también puede querer ejecutar cada vez que se inicia el contenedor, como la flask run --host=0.0.0.0 puede:
mueva ese comando para que se siente dentro del archivo run.py
o
mantenga la línea CMD [ "flask", "run", "--host=0.0.0.0" ] . este comando se pasará como argumento al punto de entrada run.py, por lo que puede ejecutarlo allí. de esa manera, puede anular fácilmente el comando al ejecutar el contenedor con argumentos alternativos.
este material también está en los documentos :
Comprender cómo interactúan CMD y ENTRYPOINT
Las instrucciones CMD y ENTRYPOINT definen qué comando se ejecuta cuando se ejecuta un contenedor. Hay pocas reglas que describen su cooperación.
Dockerfile debe especificar al menos uno de los comandos CMD o ENTRYPOINT.
El PUNTO DE ENTRADA debe definirse al usar el contenedor como un ejecutable.
CMD debe usarse como una forma de definir argumentos predeterminados para un comando ENTRYPOINT o para ejecutar un comando ad-hoc en un contenedor.
CMD se anulará cuando se ejecute el contenedor con argumentos alternativos.