Docker容器无法运行,错误:python3:无法打开文件“ flask run --host = 0.0.0.0”:[Errno 2]没有此类文件或目录

时间:2019-03-26 17:34:52

标签: python docker flask docker-compose dockerfile

我是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]没有这样的文件或目录

1 个答案:

答案 0 :(得分:0)

  

ENTRYPOINT的最佳用途是设置图像的主命令,   允许该图像像该命令一样运行(然后   使用CMD作为默认标志。

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#entrypoint

很多人似乎错过了关于ENTRYPOINTCMD 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将被覆盖   争论。