Python:Docker 映像构建——通过 requirements.txt 与可编辑安装安装所需的包。
通过 requirements.txt 安装意味着使用此映像构建步骤命令“RUN pip3 install -r requirements.txt”。可编辑安装意味着使用“RUN pip3 install -e”。命令。我经历过通过 requirements.txt 安装会导致图像无法运行,而使用可编辑安装会导致图像按预期工作。我在这篇文章中展示了我的发现。
我学习的第一个 Docker 教程是学习使用 Docker轻松地构建和部署您的分布式应用程序到云,这是一个很好的教程,我确实成功地完成了所有这些。然后我做了这个Build your Python image- 只有第一部分。
它们之间的共同点是——在我的观察中:
- 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
进入全屏模式 退出全屏模式
它不起作用,如下面的屏幕截图所示:
[
](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
进入全屏模式 退出全屏模式
它运行成功:
[
](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 映像构建步骤非常有效。我很高兴。感谢您的阅读,我希望您发现这篇文章对您有所帮助。
更多推荐
所有评论(0)