我是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>
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" ]
预期:应用程序应在容器上运行。 实际:Python3:无法打开文件“烧瓶”:[Errno 2]没有这样的文件或目录
答案 0 :(得分:0)
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将被覆盖 争论。