Joã*_*lho 4 python pip dependency-management docker python-poetry
我有一个使用 FastAPI 或 Django 等框架构建的 Web 应用程序,我的项目使用 Poetry 来管理依赖项。
我没有找到任何与此类似的主题。
问题是:我应该在生产 dockerfile 中安装诗歌并使用诗歌安装依赖项,还是应该导出requirements.txt并在我的 docker 映像中使用 pip?
实际上,我requirements.txt在部署应用程序之前将其导出到项目的根目录,然后在 docker 映像中使用它。
我的动机是,我不需要在 dockerfile 中使用诗歌的“复杂性”,因为它requirements.txt已经由诗歌生成,并且在图像中使用它将生成 docker 构建的新步骤,这可能会影响构建速度。
然而,我看到很多带有诗歌安装的 dockerfiles,这让我觉得我对该工具的使用很糟糕。
在制作中没有必要使用诗歌。要理解这一点,我们应该回顾一下诗歌存在的最初原因。诗歌的产生基本上有两个主要原因:
原因没有。2 并不是真正关心这个问题,所以让我们看看没有的原因。1. 为什么我们在开发中需要像诗歌这样的东西?这是因为开发人员之间的开发环境可能不同。我的 venv 可能在,/home/kamal/.venv而 John 可能想要花哨并将他的 virtualenv 放在/home/john/.local/venv.
当写关于如何设置和运行项目的笔记时,你会如何写笔记来迎合我和约翰之间的差异?我们可能会使用一些占位符,例如/path/to/your/venv. 使用诗歌,我们就不必担心这个问题。只需在注释中写下您应该运行命令:-
poetry run python manage.py runserver ...
Run Code Online (Sandbox Code Playgroud)
诗歌照顾所有的差异。但在生产中,我们不存在这个问题。我们的应用程序在生产中将位于一个位置,比如说在/app. 当写关于如何在生产中运行命令的注释时,我们可以这样写:-
/app/.venv/bin/myapp manage collectstatic ...
Run Code Online (Sandbox Code Playgroud)
下面是我们用来使用 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
Run Code Online (Sandbox Code Playgroud)
我们使用多阶段构建,在构建阶段,我们仍然使用诗歌来安装所有依赖项,但在最后阶段,我们只需复制/app其中也包括.venvvirtualenv 文件夹。
| 归档时间: |
|
| 查看次数: |
5429 次 |
| 最近记录: |