python - 我应该在生产 dockerfile 中使用 Poetry 吗?

标签 python docker pip dependency-management python-poetry

我有一个使用 FastAPI 或 Django 等框架构建的 Web 应用程序,我的项目使用 Poetry 来管理依赖项。

我没有找到任何与此类似的主题。

问题是:我应该在生产 dockerfile 中安装诗歌并使用诗歌安装依赖项,还是应该导出 requirements.txt 并在其中使用 pip我的 docker 图像?

实际上,我在部署应用程序之前将 requirements.txt 导出到项目的根目录,然后在 Docker 镜像中使用它。

我的动机是,我不需要在 dockerfile 中使用诗歌的“复杂性”,因为 requirements.txt 已经由诗歌生成,并且在图像中使用它会生成一个docker 构建的新步骤可能会影响构建速度。

但是,我看到很多带有诗歌安装的 dockerfile,这让我觉得我对该工具的使用很糟糕。

最佳答案

在制作中没有必要使用诗歌。要理解这一 pip ,我们应该回顾一下诗歌存在的最初原因。诗歌基本上有两个主要原因:-

  1. 为我们管理 python venv - 过去人们使用不同的工具,从自制脚本到 virtualenvwrapper 之类的工具来自动管理虚拟环境。
  2. 帮助我们将软件包发布到 PyPI

原因编号。 2 并不是真正关心这个问题,所以让我们看看没有的原因。 1. 为什么我们在开发中需要像诗歌这样的东西?这是因为开发人员之间的开发环境可能不同。我的 venv 可能位于 /home/kamal/.venv而 John 可能想变得更花哨,把他的 virtualenv 放在 /home/john/.local/venv 中.

在编写有关如何设置和运行项目的注释时,您将如何编写注释来满足我和约翰之间的差异?我们可能会使用一些占位符,例如 /path/to/your/venv 。使用诗歌,我们就不必担心这个问题。只需在注释中写下您应该运行命令:-

poetry run python manage.py runserver ...

诗歌照顾所有差异。但在生产中,我们不存在这个问题。我们的应用程序在生产中将位于一个位置,比如说 /app 。当编写关于如何在生产环境中运行命令的注释时,我们可以这样写:-

/app/.venv/bin/myapp manage collectstatic ...

下面是我们用来使用 docker 部署应用程序的示例 Dockerfile:-

FROM python:3.10-buster as py-build

# [Optional] Uncomment this section to install additional OS packages.
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
     && apt-get -y install --no-install-recommends netcat util-linux \
        vim bash-completion yamllint postgresql-client

RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry python3 -

COPY . /app
WORKDIR /app
ENV PATH=/opt/poetry/bin:$PATH
RUN poetry config virtualenvs.in-project true && poetry install

FROM node:14.20.0 as js-build

COPY . /app
WORKDIR /app
RUN npm install && npm run production

FROM python:3.10-slim-buster

EXPOSE 8000
COPY --from=py-build /app /app
COPY --from=js-build /app/static /app/static
WORKDIR /app
CMD /app/.venv/bin/run

我们使用多阶段构建,在构建阶段,我们仍然使用诗歌来安装所有依赖项,但在最后阶段,我们只需复制 /app其中还包括 .venv virtualenv 文件夹。

关于python - 我应该在生产 dockerfile 中使用 Poetry 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74895750/

相关文章:

android - Docker容器中的Android模拟器没有互联网

mongodb - 如何从dockerfile启动mongodb

python - Nexus 存储库上的 conda 包

python - 尽管 gce.py 有效,但 Ansible 中的 GCE 模块找不到 apache-libcloud

python - 使用类的 __call__ 方法作为 Numpy curve_fit 的输入

linux - 当我们向 pid 1 发送停止时,docker 如何处理子进程

pip - 如果使用 pbr,如何将包版本加载到 __version__ 变量中?

python3 pip3安装到2.7

python - 尝试用生成器表达式理解 Python 代码

java - 用于面向平面文件的处理代理的开源框架