通过 requirements.txt 安装意味着使用此映像构建步骤命令“RUN pip3 install -r requirements.txt”。可编辑安装意味着使用“RUN pip3 install -e”。命令。我经历过通过 requirements.txt 安装会导致图像无法运行,而使用可编辑安装会导致图像按预期工作。我在这篇文章中展示了我的发现。

我学习的第一个 Docker 教程是学习使用 Docker轻松地构建和部署您的分布式应用程序到云,这是一个很好的教程,我确实成功地完成了所有这些。然后我做了这个Build your Python image- 只有第一部分。

它们之间的共同点是——在我的观察中:

  1. Python 项目只有一个 Python 文件。我确实浏览了其他一些教程,这些项目也有一个 Python 文件。

2.在Dockerfile文件中,都使用RUN pip3 install -r requirements.txt来安装需要的包。

我想尝试为具有多个模块的项目构建图像:大多数实际项目将具有多个模块。Synology DS218 的代码:准备 Python 3.9 Beta 完成开发环境。相当简单,第一次尝试是不错的选择。

这是代码的存储库https://github.com/behai-nguyen/app-demo。对于上面的帖子,标签是v1.0.0。它可以通过以下方式克隆:

git clone -b v1.0.0 https://github.com/behai-nguyen/app-demo.git

进入全屏模式 退出全屏模式

请注意,本文中讨论的所有 Docker 构建都已在 Windows 10 Pro 上进行,使用 docker CLI 版本 20.10.12,构建 e91ed57。

回顾一下,标签 v1.0.0 处的 app-demo 的项目布局是:

D:\app_demo\
|
|-- .env
|-- app.py
|-- setup.py
|
|-- src\
|   |
|   |-- app_demo\
|       |   
|       |-- __init__.py
|       |-- config.py
|
|-- venv\

进入全屏模式 退出全屏模式

我确实在 Windows 10 中为这个项目创建了 virtualenv venv。

使用“RUN pip3 install -r requirements.txt”命令构建

请注意,此映像构建步骤命令呈现 setup.py 未使用。

生成 requirements.txt 文件:

D:\app_demo>venv\Scripts\pip.exe freeze > requirements.txt

进入全屏模式 退出全屏模式

然后手动删除除了 setup.py 文件中 install_requires 部分中指定的那些包之外的所有内容。

File D:\app_demo\requirements.txt

进入全屏模式 退出全屏模式

Flask==2.1.2
python-dotenv==0.20.0

进入全屏模式 退出全屏模式

File D:\app_demo\Dockerfile

进入全屏模式 退出全屏模式

# syntax=docker/dockerfile:1

FROM python:3.10.5-slim-buster

WORKDIR /app_demo

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY . .

CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0" ]

进入全屏模式 退出全屏模式

File D:\app_demo\.dockerignore

进入全屏模式 退出全屏模式

__pycache__
*.pyc
*.pyo
*.pyd
.Python
venv
pip-log.txt
pip-delete-this-directory.txt
.tox
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.log
.git
.mypy_cache
.pytest_cache
.hypothesis
FlaskApp.wsgi
Working

进入全屏模式 退出全屏模式

项目布局的根级别现在是:

D:\app_demo\
|
|-- .env
|-- app.py
|-- setup.py
|-- requirements.txt 
|-- Dockerfile
|-- .dockerignore
|
...

进入全屏模式 退出全屏模式

构建命令:

D:\app_demo>docker build --tag app-demo .

进入全屏模式 退出全屏模式

构建成功运行。运行新建的镜像:

D:\app_demo>docker run --publish 8000:5000 --rm app-demo

进入全屏模式 退出全屏模式

它不起作用,如下面的屏幕截图所示:

[030-01-run-failed.png](https://res.cloudinary.com/practicaldev/image/fetch/s--M_5PvTD0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https ://behainguyen.files.wordpress.com/2022/07/030-01-run-failed.png)

错误是 ModuleNotFoundError: No module named 'app_demo'

可以使用以下方法克隆此无效构建的这些更改:

git clone -b v1.0.1 https://github.com/behai-nguyen/app-demo.git

进入全屏模式 退出全屏模式

✿✿✿

谷歌搜索表明其他人也遇到过类似的错误。建议使用绝对导入——例如,请参阅Module not found error with Python in Docker。

我确实尝试了绝对导入,因为项目很小,变化很小,并且生成的图像确实可以运行。但是,这似乎不对......我不应该那样做......

可以使用以下方法克隆使用绝对导入的更改:

git clone -b v1.0.2 https://github.com/behai-nguyen/app-demo.git

进入全屏模式 退出全屏模式

基本上,相关的导入语句在:

File D:\app_demo\app.py
File D:\app_demo\src\app_demo\__init__.py

进入全屏模式 退出全屏模式

以 src 为前缀。分别成为:

from src.app_demo import create_app
from src.app_demo.config import get_config

进入全屏模式 退出全屏模式

分别构建和运行:

D:\app_demo>docker build --tag app-demo .
D:\app_demo>docker run --publish 8000:5000 --rm app-demo

进入全屏模式 退出全屏模式

它运行成功。 http://localhost:8000 显示 Hello, World! 的预期输出!

使用“RUN pip3 install -e”构建。命令

请注意此映像构建步骤:

❶两者:

File D:\app_demo\app.py
File D:\app_demo\src\app_demo\__init__.py

进入全屏模式 退出全屏模式

将它们的导入语句反转回相对导入:

from app_demo import create_app
from app_demo.config import get_config

进入全屏模式 退出全屏模式

即前缀 src。在最后一个版本中添加已删除。

❷ 此映像构建步骤命令使 requirements.txt 过时。

✿✿✿

我正在为另一个 Python 项目制作另一个 Docker 映像,我想我会尝试 editable install RUN pip3 install -e 。反而。我确实认为无论如何我都必须将源代码更改为绝对导入,所以为什么不直接使用已经存在的 setup.py。构建刚刚完成,没有任何问题。我运行它以获得第一个导入失败......它没有失败!

有用! 我仍然不知道它为什么有效!

所以我回到这个项目,因此这篇文章。变化是:

File D:\app_demo\Dockerfile

进入全屏模式 退出全屏模式

# syntax=docker/dockerfile:1

FROM python:3.10.5-slim-buster

WORKDIR /app_demo

COPY . .

RUN /usr/local/bin/python -m pip install --upgrade pip && \
    pip3 install -e .

CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0" ]

进入全屏模式 退出全屏模式

requirements.txt 已过时;它被添加到 D:\app_demo.dockerignore。

File D:\app_demo\.dockerignore

进入全屏模式 退出全屏模式

... 
requirements.txt

进入全屏模式 退出全屏模式

使用以下命令克隆新的更改,请丢弃 requirements.txt:

git clone -b v1.0.3 https://github.com/behai-nguyen/app-demo.git

进入全屏模式 退出全屏模式

分别构建和运行:

D:\app_demo>docker build --tag app-demo .
D:\app_demo>docker run --publish 8000:5000 --rm app-demo

进入全屏模式 退出全屏模式

它运行成功:

[030-02-run-worked.png](https://res.cloudinary.com/practicaldev/image/fetch/s--SQqvmbVy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https ://behainguyen.files.wordpress.com/2022/07/030-02-run-worked.png)

http://localhost:8000 显示 Hello, World! 的预期输出!

✿✿✿

我不知道为什么 RUN pip3 install -e 。作品...如果你知道,请告诉我,我将非常感激。

由于我已决定使用 setup.py,因此这个 Docker 映像构建步骤非常有效。我很高兴。感谢您的阅读,我希望您发现这篇文章对您有所帮助。

Logo

云原生社区为您提供最前沿的新闻资讯和知识内容

更多推荐