我有一个使用 FastAPI 或 Django 等框架构建的 Web 应用程序,我的项目使用 Poetry 来管理依赖项。
我没有找到任何与此类似的主题。
问题是:我应该在生产 dockerfile 中安装诗歌并使用诗歌安装依赖项,还是应该导出 requirements.txt
并在其中使用 pip我的 docker 图像?
实际上,我在部署应用程序之前将 requirements.txt
导出到项目的根目录,然后在 Docker 镜像中使用它。
我的动机是,我不需要在 dockerfile 中使用诗歌的“复杂性”,因为 requirements.txt
已经由诗歌生成,并且在图像中使用它会生成一个docker 构建的新步骤可能会影响构建速度。
但是,我看到很多带有诗歌安装的 dockerfile,这让我觉得我对该工具的使用很糟糕。
最佳答案
在制作中没有必要使用诗歌。要理解这一 pip ,我们应该回顾一下诗歌存在的最初原因。诗歌基本上有两个主要原因:-
- 为我们管理 python venv - 过去人们使用不同的工具,从自制脚本到 virtualenvwrapper 之类的工具来自动管理虚拟环境。
- 帮助我们将软件包发布到 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/