gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:59:24 34 4
gpt4 key购买 nike

我有一个使用 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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com