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] 没有那个文件或目录
\n\nENTRYPOINT 的最佳用途是设置映像\xe2\x80\x99 的主命令,\n允许该映像像该命令一样运行(然后\n使用 CMD 作为默认标志)。
\n
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#entrypoint
\n很多人似乎忽略了有关 Dockerfile 指令的这ENTRYPOINT一点CMD。
该ENTRYPOINT指令应该运行一些可执行文件,该可执行文件应该在每次启动容器(例如启动服务器)时运行。
应该CMD包含提供给该可执行文件的标志,因此在运行容器时可以轻松覆盖它们。
我不确定你是否应该收到不止一项CMD指示。如果您需要在构建过程中运行命令,您可以使用指令RUN- 例如:
RUN mkdir some/dir\nRun Code Online (Sandbox Code Playgroud)\n现在:
\n\n\nrun.py是用于执行的主要Python Flask文件
\n
因此我建议您将其定义为您的入口点:
\nENTRYPOINT [ "./run.py" ]\nRun Code Online (Sandbox Code Playgroud)\n您可能还希望在每次容器启动时运行的命令,例如flask run --host=0.0.0.0:
将该命令移至run.py文件内
或者
\n保持CMD [ "flask", "run", "--host=0.0.0.0" ]线路。该命令将作为参数传递给 run.py 入口点,因此您可以在那里执行它。这样,您可以在使用替代参数运行容器时轻松覆盖该命令。
这些东西也在文档中:
\n\n\n了解 CMD 和 ENTRYPOINT 如何交互
\nCMD 和 ENTRYPOINT 指令都定义了运行容器时执行的命令。描述他们合作的规则很少。
\nDockerfile 应至少指定 CMD 或 ENTRYPOINT 命令之一。
\n将容器用作\n可执行文件时应定义 ENTRYPOINT。
\nCMD 应该用作定义 ENTRYPOINT 命令的默认参数或在容器中执行临时命令的方法。
\n当使用替代\参数运行容器时,CMD 将被覆盖。
\n
| 归档时间: |
|
| 查看次数: |
7134 次 |
| 最近记录: |