1. 概述

依赖管理是软件工程中至关重要的一环。在 Python 生态中,多年来出现了多种改进依赖管理的工具。**Poetry** 就是其中一种,它提供了一种更简洁、统一的方式来管理项目依赖,而无需依赖多个工具。

本文将介绍 Poetry 的基本使用方法,并演示如何在 Docker 容器中集成 Poetry 来构建和运行 Python 项目。

2. Poetry 依赖管理工具

Poetry 是一个专为简化 Python 依赖管理而设计的工具。它不依赖传统的 requirements.txtsetup.cfgPipfile,而是仅使用一个统一的 TOML 配置文件:pyproject.toml

这个文件中包含了项目的所有依赖和构建配置,通过 poetry 命令即可完成项目的构建、测试和运行。可以说,它的设计灵感来源于 Rust 的 Cargo

2.1. 基本使用

你可以通过 cURL 从官方安装 Poetry:

$ curl -sSL https://install.python-poetry.org | python3 -

创建一个新项目:

$ poetry new news-aggregator

添加依赖:

$ poetry add scrapy feedreader

查看 pyproject.toml 文件内容:

[tool.poetry]
name = "news-aggregator"
version = "0.1.0"
description = ""
authors = ["Your Name <your.name@example.com>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.12"
scrapy = "^2.11.2"
feedreader = "^0.3.1"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

对于已有项目,只需执行以下命令即可安装依赖:

$ poetry install && poetry sync

卸载依赖:

$ poetry remove feedreader && poetry sync

项目目录结构如下:

.
├── Dockerfile
├── main.py
├── news_aggregator
│   └── __init__.py
├── poetry.lock
├── pyproject.toml
├── README.md
└── tests
    └── __init__.py

进入虚拟环境:

$ poetry shell

构建项目:

$ poetry build

Poetry 的使用流程相比传统的 pip + virtualenv 更加简洁高效,但将其集成到 Docker 中时,还需要注意一些细节。

3. 在 Docker 中使用 Poetry

本节将介绍如何将 Poetry 项目容器化,并构建一个可部署的 Docker 镜像。

3.1. Dockerfile 初步设置

我们从 Python 官方镜像开始构建:

FROM python:3.12.6-slim-bookworm

设置环境变量:

# Python
ENV PYTHONFAULTHANDLER=1 \
    PYTHONUNBUFFERED=1 \
    PYTHONHASHSEED=random \
    PIP_NO_CACHE_DIR=off \
    PIP_DISABLE_PIP_VERSION_CHECK=on \
    PIP_DEFAULT_TIMEOUT=100

# Poetry
ENV POETRY_NO_INTERACTION=1 \
    POETRY_VIRTUALENVS_CREATE=false \
    POETRY_CACHE_DIR='/var/cache/pypoetry' \
    POETRY_HOME='/usr/local' \
    POETRY_VERSION=1.8.3

ENV YOUR_ENV=${YOUR_ENV}

⚠️ 注意:我们禁用了 Poetry 的虚拟环境功能,因为 Docker 本身已经提供了隔离环境。

3.2. 安装 Poetry 和依赖缓存

先安装 cURL,然后安装 Poetry:

RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
RUN curl -sSL https://install.python-poetry.org | python3 -

设置工作目录:

WORKDIR /app

复制依赖文件,以便利用 Docker 缓存机制:

COPY pyproject.toml poetry.lock /app/

3.3. 安装依赖

使用环境变量控制安装生产或开发依赖:

$ poetry install --no-ansi $(test "$ENVIRONMENT" == production && echo "--only=main")

--only=main 表示只安装生产依赖(即 tool.poetry.dependencies 中的依赖)
--no-ansi 用于避免日志输出中的 ANSI 转义码,便于日志查看

3.4. 拷贝项目代码

将项目文件拷贝进容器:

COPY . /app

建议添加 .dockerignore 文件排除不必要的文件,减少构建上下文。

3.5. 启动命令

定义容器启动命令:

CMD ["poetry", "run", "python", "main.py"]

你也可以根据需要修改启动命令,比如运行测试或启动服务。

3.6. 完整 Dockerfile

FROM python:3.12.6-slim-bookworm

# Python
ENV PYTHONFAULTHANDLER=1 \
    PYTHONUNBUFFERED=1 \
    PYTHONHASHSEED=random \
    PIP_NO_CACHE_DIR=off \
    PIP_DISABLE_PIP_VERSION_CHECK=on \
    PIP_DEFAULT_TIMEOUT=100

# Poetry
ENV POETRY_NO_INTERACTION=1 \
    POETRY_VIRTUALENVS_CREATE=false \
    POETRY_CACHE_DIR='/var/cache/pypoetry' \
    POETRY_HOME='/usr/local' \
    POETRY_VERSION=1.8.3

ENV YOUR_ENV=${YOUR_ENV}

RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
RUN curl -sSL https://install.python-poetry.org | python3 -
WORKDIR /app
COPY pyproject.toml poetry.lock /app/

COPY . /app
CMD ["poetry", "run", "python", "main.py"]

3.7. 构建与运行容器

构建镜像:

$ docker build -t news-aggregator .

运行容器:

$ sudo docker run -d --name instance-1 -e ENVIRONMENT=production news-aggregator

4. 小结

本文介绍了 Poetry 这一现代化的 Python 依赖管理工具,并演示了如何将其集成到 Docker 容器中。通过一个简洁的 Dockerfile,我们实现了项目依赖的高效管理与部署。

✅ Poetry 简化了依赖管理流程
✅ Docker 提供了可靠的部署环境
✅ 二者结合可以构建出结构清晰、易于维护的 Python 项目

如果你正在寻找一个现代化、统一化的 Python 项目管理方式,Poetry + Docker 是一个非常值得尝试的组合。


原始标题:Dockerizing the Python Poetry Project