Poetry
如果在构建你的docker镜像时,总是安装最新的版本依赖,则可能导致各种问题,例如,在你不知道的情况下升级包时,会出现随机的问题。
为了避免这种情况,希望保持项目依赖的二个版本:
- 1.你直接安装的包,即逻辑依赖,例如Django.
- 2.所有Django的依赖(及它们的依赖项等),都固定到特定的版本。
固定的依赖项是用来重复构建的。Poetry 对于Docker镜像的可重复构建非常有用。它允许你分别管理逻辑依赖和文件中的固定依赖。pyproject.toml、poetry.lock 它已成为python项目的首选工具,因为它作为依赖管理器和包管理器的速度和适用性。
在继续之前,需要花点时间阅读和了解一些Poetry官方文档的基础知识。 python-poetry.org/docs/
或者你可以阅读之前的文章,进行简单的了解。
1. 项目设置
创建一个项目文件夹,或者拉取一个现有仓库的项目
mkdir django-demo && cd django-demo
//git clone https://github.com/<user>/<repo>/
2. 为项目生成poetry配置
# 安装poetry
[root@VM-0-16-centos django-demo]# pip install poetry
# 初始化poetry
[root@VM-0-16-centos django-demo]# poetry init
在已有的项目使用poetry,只需要执行 poetry init 命令来创建一个pyproject.toml文件,可看到有很多提示输入,不确定的内容就先按下Enter使用默认值,后续可以再修改pyproject.toml文件。
[root@VM-0-16-centos django-demo]# cat pyproject.toml
[tool.poetry]
name = "django-demo"
version = "0.1.0"
description = ""
authors = ["liuxxx <238xxx1@qq.com>"]
[tool.poetry.dependencies]
python = "^3.6"
[tool.poetry.dev-dependencies]
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
配置poetry安装源, 在pyproject.toml里添加以下内容
[[tool.poetry.source]]
name = 'aliyun.mirrors'
url = "http://mirrors.aliyun.com/pypi/simple/"
3.虚拟环境
3.1 创建虚拟环境
查看poetry配置
[root@VM-0-16-centos django-demo]# poetry config --list
cache-dir = "/root/.cache/pypoetry"
experimental.new-installer = true
installer.parallel = true
virtualenvs.create = true
...
当参数 virtualenvs.create=true 时,执行 poetry install 或 poetry add 时会检测当前项目是否有虚拟环境,没有就自动创建。
如果系统中既有Python2又有Python3,且项目既支持Python2也支持Python3,那poetry会优先使用Python2。
我们可以通过poetry env use命令指定Python版本创建虚拟环境
[root@VM-0-16-centos django-demo]# poetry env use python3
Using virtualenv: /root/.cache/pypoetry/virtualenvs/django-demo-Rynr7wfR-py3.6
使用这个命令后,会在虚拟环境路径下创建一个envs.toml文件, 用来存储哪些虚拟环境制定了Python的版本
[root@VM-0-16-centos django-demo]# cd /root/.cache/pypoetry/virtualenvs/
[root@VM-0-16-centos virtualenvs]# ls
django-demo-Rynr7wfR-py3.6 envs.toml
[root@VM-0-16-centos virtualenvs]# cat envs.toml
[django-demo-Rynr7wfR]
minor = "3.6"
patch = "3.6.8"
3.2 激活虚拟环境
执行poetry的命令并不需要激活虚拟环境,因为poetry会自动检测当前虚拟环境,如果想在当前目录对应的虚拟环境中执行命令,可以使用以下命令:
poetry run python test.py
如果想显示的激活虚拟环境,使用如下命令:
[root@VM-0-16-centos django-demo]# poetry shell
Spawning shell within /root/.cache/pypoetry/virtualenvs/django-demo-Rynr7wfR-py3.6
. /root/.cache/pypoetry/virtualenvs/django-demo-Rynr7wfR-py3.6/bin/activate
[root@VM-0-16-centos django-demo]# . /root/.cache/pypoetry/virtualenvs/django-demo-Rynr7wfR-py3.6/bin/activate
(django-demo-Rynr7wfR-py3.6) [root@VM-0-16-centos django-demo]#
4. 安装 Django
[root@VM-0-16-centos django-demo]# poetry add django
Creating virtualenv django-demo-Rynr7wfR-py3.6 in /root/.cache/pypoetry/virtualenvs
使用 add 命令进行安装,它将自动找到合适的版本约束并安装包和子依赖项。
初始化我们的 Django 项目
[root@VM-0-16-centos django-demo]# poetry run django-admin startproject demo_project .
[root@VM-0-16-centos django-demo]# ls
demo_project manage.py poetry.lock pyproject.toml
5. Dockerfile
在项目根目录中创建 Dockerfile 并添加以下内容:
FROM python:3.8-buster
EXPOSE 8000
# 安装peotry
RUN pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com poetry
WORKDIR /app
COPY . /app
# 设置virtualenvs.create=false, 来禁用Poetry创建虚拟环境
RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi
参考资料:blog.csdn.net/zhoubihui00…