Docker成为首选的应用程序分布方式。对于Python应用程序,它已成为强制性的,因为它实际上可以保证,如果图像在一个环境中起作用,则它将对其他环境起作用。该策略还可以使部署有可能。 Docker允许通过播放版本编号来促进图像从环境中促进图像,并允许DevOps做法作为gitops或金丝雀部署。
正如我在I move from pipenv to poetry in 2023 - Am I right ?文章中解释的那样,我将项目从Pipenv转移到诗歌。我还必须升级Docker包装。我将尝试分享我学到的东西。我将描述我用来从诗歌项目中构建Docker图像的5种实践。
- install a virtual environment in the docker image
- copy only what is strictly necessary by filtering files and folders with .dockerignore
- ignore dev libraries when installing dependencies
- add the virtual environment in the PATH
- use a multi-stage docker build to exclude poetry
在Docker图像中安装虚拟环境
在Docker Image中,我们将像本地一样在项目中安装虚拟环境。环境将安装在/app/.venv
文件夹中。这样需要这样做才能排除诗歌依赖性,感谢Docker多阶段的构建。
要确保在源旁边创建项目的虚拟环境,在可预测的文件夹中,必须配置诗歌。我们可以使用此命令来完成:
poetry config virtualenvs.in-project true --local
我首先怀疑这种做法。我的印象是,在容器中创建虚拟环境是适得其反的。但是,有必要能够将诗歌排除在最终图像之外。
仅复制使用.dockerignore过滤文件和文件夹严格必要的内容
在生产图像中,拖动用于开发的所有文件和文件夹不是一个好主意。 .dockerignore
文件是一个清单,在使用ADD
或COPY
语句的图像中添加文件夹时指定要排除的文件和文件夹。 .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"]
我更喜欢此技术,而不是入口点过载,因为当我们需要在容器上连接时,它可以使用sh
或bash
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"]
这5种实践可以帮助您构建工作流程以从诗歌项目中分发Docker图像。如果您每天使用其他工作流或技巧,请在评论中与我们分享。
最后,我从本文中丢弃了您也可以应用的几种实践。
您可以制作自己的基本图像,而不是使用已经包装的基本图像。 python
图像定期更新。它具有正面的积极效果,例如最新的,但也具有负面影响,例如减少每个部署的所有层。在带宽很珍贵的情况下,更好地计划基本图像的更新以减少带宽消耗是很有趣的。
在同一方面,另一种做法是分别安装外部依赖性和应用程序代码。仅通过下载已修改的图层来保存带宽总是一样的。
我根本不使用的最后一个练习,您可能会使用slim toolkit来保留最终图像中的有用元素。