包装在Docker容器中进行生产的诗歌项目
#python #devops #docker #poetry

Docker成为首选的应用程序分布方式。对于Python应用程序,它已成为强制性的,因为它实际上可以保证,如果图像在一个环境中起作用,则它将对其他环境起作用。该策略还可以使部署有可能。 Docker允许通过播放版本编号来促进图像从环境中促进图像,并允许DevOps做法作为gitops或金丝雀部署。

正如我在I move from pipenv to poetry in 2023 - Am I right ?文章中解释的那样,我将项目从Pipenv转移到诗歌。我还必须升级Docker包装。我将尝试分享我学到的东西。我将描述我用来从诗歌项目中构建Docker图像的5种实践。

在Docker图像中安装虚拟环境

在Docker Image中,我们将像本地一样在项目中安装虚拟环境。环境将安装在/app/.venv文件夹中。这样需要这样做才能排除诗歌依赖性,感谢Docker多阶段的构建。

要确保在源旁边创建项目的虚拟环境,在可预测的文件夹中,必须配置诗歌。我们可以使用此命令来完成:

poetry config virtualenvs.in-project true --local

我首先怀疑这种做法。我的印象是,在容器中创建虚拟环境是适得其反的。但是,有必要能够将诗歌排除在最终图像之外。

仅复制使用.dockerignore过滤文件和文件夹严格必要的内容

在生产图像中,拖动用于开发的所有文件和文件夹不是一个好主意。 .dockerignore文件是一个清单,在使用ADDCOPY语句的图像中添加文件夹时指定要排除的文件和文件夹。 .dockerignore使用与gitignore相同的语法。

通常,我们会忽略包含测试,构建工件和.venv文件夹的软件包。您可以忽略所有由Mypy,Coverage,...

等公用事业生产的人工制品

.dockerignore

/.venv
/tests
/build

这是一个示例Dockerfile。该代码部署在/app文件夹中。 COPY . /app不复制清单.dockerignore

中指定的所有项目

dockerfile

FROM python:3.10-slim

RUN pip install poetry  
RUN mkdir -p /app  
COPY . /app

WORKDIR /app

RUN poetry install
CMD ["poetry", "run", "python", "-m", "app.main"]

安装依赖项时忽略开发库

poetry允许我们在忽略开发依赖性的同时安装项目依赖项。这些依赖性占用空间,当应用程序在生产中运行时是不必要的。此外,它们在运行时仍然可以访问并可以降低应用程序的安全性。

FROM python:3.10-slim

RUN pip install poetry  
RUN mkdir -p /app  
COPY . /app

WORKDIR /app

RUN poetry install --without dev
CMD ["poetry", "run", "python", "-m", "app.main"]

在路径中添加虚拟环境

默认情况下,Docker Image使用System Python。始终以poetry run的命令前缀是不切实际的。我们将在优先使用诗歌的虚拟环境中添加诗歌的虚拟环境。

此技巧使容器更加健壮,因为您不需要再考虑诗歌即可将自定义命令放在容器上。

# ...
ENV PATH="/app/.venv/bin:$PATH"

RUN poetry install --without dev
CMD ["python", "-m", "app.main"]

我更喜欢此技术,而不是入口点过载,因为当我们需要在容器上连接时,它可以使用shbash Intuitive的命令。

使用多阶段的Docker构建来排除诗歌

这种做法使得排除构建过程中使用的所有库。容器环境将不再包含诗歌或该工具包拉的依赖。

这种做法与避免安装DEV依赖关系具有相同的效果。它可以减少容器的大小,将其从240MB的容器传递到144MB。

FROM python:3.10-slim as builder

RUN pip install poetry
RUN mkdir -p /app
COPY . /app

WORKDIR /app
RUN poetry install --without dev

FROM python:3.10-slim as base

COPY --from=builder /app /app

WORKDIR /app
ENV PATH="/app/.venv/bin:$PATH"
CMD ["python", "-m", "app.main"]

Image description

这5种实践可以帮助您构建工作流程以从诗歌项目中分发Docker图像。如果您每天使用其他工作流或技巧,请在评论中与我们分享。

最后,我从本文中丢弃了您也可以应用的几种实践。

您可以制作自己的基本图像,而不是使用已经包装的基本图像。 python图像定期更新。它具有正面的积极效果,例如最新的,但也具有负面影响,例如减少每个部署的所有层。在带宽很珍贵的情况下,更好地计划基本图像的更新以减少带宽消耗是很有趣的。

在同一方面,另一种做法是分别安装外部依赖性和应用程序代码。仅通过下载已修改的图层来保存带宽总是一样的。

我根本不使用的最后一个练习,您可能会使用slim toolkit来保留最终图像中的有用元素。