如何使用 Poetry 和 Docker 初始化 Django 项目。

1,788 阅读3分钟

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…

原文:medium.com/@samwelkand…

扫码_搜索联合传播样式-标准色版.png