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

jk1*_*093 5 python flask docker dockerfile docker-compose

我是 docker 新手,我正在尝试 dockerize 一个 python Flask 微服务。docker 文件构建成功,但在运行容器时出现错误:

python3: can't open file 'flask': [Errno 2] No such file or directory
Run Code Online (Sandbox Code Playgroud)

我假设我的 docker 文件中有一些错误,无论是在 COPY 路径、ENTRYPOINT 还是 CMD 中,即我用来运行 Flask 应用程序的命令。我无法弄清楚错误。

Ubuntu机器上的目录结构是:

/home/ubuntu/Docker/auth
Run Code Online (Sandbox Code Playgroud)

目录 auth 包含我的 Dockerfile 和所有其他 python Flask 文件:

$ls 
Dockerfile   run.py    views.py     resources.py    models.py
Run Code Online (Sandbox Code Playgroud)

run.py 是用于执行的主要 python 烧瓶文件。我确定我在执行 Flask 应用程序的 CMD 命令时存在一些语法错误,并且无法找到 run.py 来执行。我无法纠正那个错误。

镜像构建成功。为了运行我使用的容器:

docker build <imageid>
Run Code Online (Sandbox Code Playgroud)

文件

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" ]
Run Code Online (Sandbox Code Playgroud)

预期:应用程序应该在容器上运行。实际:Python3:无法打开文件 'flask':[Errno 2] 没有那个文件或目录

Efr*_*tan 3

\n

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

\n
\n

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

\n

很多人似乎忽略了有关 Dockerfile 指令的这ENTRYPOINT一点CMD

\n

ENTRYPOINT指令应该运行一些可执行文件,该可执行文件应该在每次启动容器(例如启动服务器)时运行。

\n

应该CMD包含提供给该可执行文件的标志,因此在运行容器时可以轻松覆盖它们。

\n

我不确定你是否应该收到不止一项CMD指示。如果您需要在构建过程中运行命令,您可以使用指令RUN- 例如:

\n
RUN mkdir some/dir\n
Run Code Online (Sandbox Code Playgroud)\n

现在:

\n
\n

run.py是用于执行的主要Python Flask文件

\n
\n

因此我建议您将其定义为您的入口点:

\n
ENTRYPOINT [ "./run.py" ]\n
Run Code Online (Sandbox Code Playgroud)\n

您可能还希望在每次容器启动时运行的命令,例如flask run --host=0.0.0.0

\n
    \n
  • 将该命令移至run.py文件内

    \n

    或者

    \n
  • \n
  • 保持CMD [ "flask", "run", "--host=0.0.0.0" ]线路。该命令将作为参数传递给 run.py 入口点,因此您可以在那里执行它。这样,您可以在使用替代参数运行容器时轻松覆盖该命令。

    \n
  • \n
\n

这些东西也在文档中:

\n
\n

了解 CMD 和 ENTRYPOINT 如何交互

\n

CMD 和 ENTRYPOINT 指令都定义了运行容器时执行的命令。描述他们合作的规则很少。

\n

Dockerfile 应至少指定 CMD 或 ENTRYPOINT 命令之一。

\n

将容器用作\n可执行文件时应定义 ENTRYPOINT。

\n

CMD 应该用作定义 ENTRYPOINT 命令的默认参数或在容器中执行临时命令的方法。

\n

当使用替代\参数运行容器时,CMD 将被覆盖。

\n
\n