docker 我应该在生产文档中使用诗歌吗?

yrdbyhpb  于 2022-12-29  发布在  Docker
关注(0)|答案(1)|浏览(88)

我有一个用FastAPI或Django这样的框架构建的Web应用程序,我的项目使用Poetry来管理依赖项。
我没有找到任何类似的主题。

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

实际上,在部署应用程序之前,我将requirements.txt导出到项目的根目录,并在Docker映像中使用它。
我的动机是,我不需要在docker文件中使用诗歌的“复杂性”,因为requirements.txt已经由诗歌生成,在映像中使用它将生成一个新的步骤,从而影响构建速度。
但是,我已经看到了很多dockerfiles与诗歌安装,是什么让我认为我做了一个坏的使用工具。

ca1c2owp

ca1c2owp1#

生产中不需要用诗。要理解这一点,我们应该回顾一下诗存在的最初原因。基本上有两个主要原因:-
1.为我们管理python venv-过去人们使用不同的工具,从自己开发的脚本到类似virtualenvwrapper的东西来自动管理虚拟环境。
1.帮助我们将软件包发布到PyPI
第二个原因不是这个问题真正关心的问题,所以让我们看看第一个原因。为什么我们需要在开发中像诗这样的东西?这是因为开发环境可能在不同的开发人员之间是不同的。我的venv可能是在/home/kamal/.venv,而约翰可能想把他的virtualenv放在/home/john/.local/venv
在写如何设置和运行你的项目的注解时,你会如何写注解来迎合我和John之间的差异呢?我们可能会使用一些占位符,如/path/to/your/venv。使用诗歌,我们不必担心这个问题。只需在注解中写上你应该运行的命令如下:-

poetry run python manage.py runserver ...

诗歌照顾所有的差异。但在生产中,我们没有这个问题。我们的应用在生产中将在单一的地方,比方说在/app。当写笔记如何运行命令在生产中,我们可以只写:-

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

下面是一个示例Dockerfile,我们使用Docker部署我们的应用:-

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

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

相关问题