[英]having on running flask app on docker container : Error: python: can't open file '//run.py': [Errno 2] No such file or directory Docker Error
[英]Docker container fails to run, Error : python3: can't open file 'flask run --host=0.0.0.0': [Errno 2] No such file or directory
我是Docker的新手,我正在尝试将python flask Microservice进行dockerize。 docker文件构建成功,但是在运行容器时出现错误:
python3: can't open file 'flask': [Errno 2] No such file or directory
我假设我的docker文件在COPY路径,ENTRYPOINT或CMD中存在一些错误,即我用来运行flask应用程序的命令。 我无法找出错误。
Ubuntu机器上的目录结构为:
/home/ubuntu/Docker/auth
目录auth包含我的Dockerfile和所有其他python flask文件:
$ls
Dockerfile run.py views.py resources.py models.py
run.py是要执行的主要python flask文件。 我确定在我对烧瓶应用程序执行CMD命令的方式中存在语法错误,并且它找不到执行的run.py。 我无法纠正该错误。
映像成功构建。 为了运行容器,我使用:
docker build <imageid>
Docker文件
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" ]
预期:应用程序应在容器上运行。 实际:Python3:无法打开文件“烧瓶”:[Errno 2]没有此类文件或目录
ENTRYPOINT的最佳用途是设置映像的主命令,以使该映像像该命令一样运行(然后使用CMD作为默认标志)。
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#entrypoint
许多人似乎错过了关于ENTRYPOINT
和CMD
Dockerfile指令的这一点。
ENTRYPOINT
指令应运行一些可执行文件,该文件应在每次启动容器时运行,例如启动服务器。
CMD
应该包含提供给该可执行文件的标志,因此在运行容器时可以轻松地覆盖它们。
我不确定您是否应该拥有一份以上的CMD
指令。 如果需要在构建过程中运行命令,则可以使用RUN
指令-例如:
RUN mkdir some/dir
现在:
run.py是要执行的主要python flask文件
因此,我建议您将其定义为入口点:
ENTRYPOINT [ "./run.py" ]
您可能还希望每次容器启动时都运行的命令,例如flask run --host=0.0.0.0
您可以:
将命令移到run.py
文件中
要么
保持CMD [ "flask", "run", "--host=0.0.0.0" ]
行。 该命令将作为参数传递给run.py入口点,因此您可以在其中执行它。 这样,当您使用替代参数运行容器时,您可以轻松地覆盖命令。
这些东西也在docs中 :
了解CMD和ENTRYPOINT如何相互作用
CMD和ENTRYPOINT指令均定义运行容器时执行的命令。 很少有规则描述他们的合作。
Dockerfile应至少指定CMD或ENTRYPOINT命令之一。
使用容器作为可执行文件时,应定义ENTRYPOINT。
应将CMD用作为ENTRYPOINT命令定义默认参数或在容器中执行自定义命令的方式。
使用替代参数运行容器时,CMD将被覆盖。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.