繁体   English   中英

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

[英]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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM