关于如何在 docker 中管理 python 模块的建议?

Advice for how to manage python modules in docker?

我正在寻求有关如何在 docker 上下文中管理 python 模块的建议。

我知道的当前选项包括:

  1. 在构建过程中通过 pip 单独安装它们
  2. 在构建过程中通过 pip 将它们安装在一起 requirments.txt
  3. 将它们安装到一个卷并将该卷添加到 PYTHONPATH

理想情况下,我想要一个完全可重新生成的解决方案,如果我决定添加另一个模块或更新其中一个模块的版本,则不需要重新安装每个模块。

从我的角度来看:
(2) 是一个问题,因为 docker ADD 命令(访问 requirements.txt 文件)显然会使缓存无效,这意味着对文件的任何更改都意味着必须重新-每次构建图像​​时都会构建/重新安装。
(1) 保持缓存完好无损,但这意味着您需要为每个包指定确切的版本(可能还有它们的依赖项?)这看起来可能非常乏味且容易出错。
(3) 目前是我个人最喜欢的,因为它允许包在 images/builds 之间持续存在并允许使用 requirements.txt。唯一的缺点是本质上你是将包存储在本地机器上而不是图像,这导致容器依赖于主机 OS 这有点破坏了容器的意义。

所以我不完全确定这里有哪些最佳做法,不胜感激。

作为参考,还有关于此主题的其他问题,但我认为没有任何问题可以正确解决我的上述问题:
docker with modified python modules?

编辑:
只是一些额外的注释来提供更多的上下文。我的项目通常以数据分析为重点(而不是软件开发或网络开发)。我倾向于使用多个图像(1 个用于 python,1 个用于 R,1 个用于数据库)使用 docker 组合来管理它们。到目前为止,我一直在主机 OS 上使用 makefile 从头开始​​重新构建项目,例如

some_output.pdf:  some_input.py
    docker-compose run python_container python some_input.py

将输出写入主机上的卷的位置 OS

requirements.txt 文件是最佳选择。 (即使更改它也会完全重新安装。)

一位新开发人员开始处理您的项目。他们检查您的源代码控制存储库并说,"oh, it's a Python project!",创建一个虚拟环境,然后 运行 pip install -r requirements.txt,然后他们就可以开始了。一周后他们过来说 "so how do we deploy this?",但由于您已经将正常的 Python 设置包装在 Docker 中,他们不必特意使用奇怪的 Docker-具体的开发过程。

灾难!您的主服务器的硬盘崩溃了!您拥有所有 数据 的备份,但应用程序代码只是从源代码管理中重建的。如果您将 code 保存在 Docker 卷(或绑定安装的主机目录)中,您需要弄清楚如何重建它;但是你的前两个选项已经写在 Dockerfile 中了。这对于上一段中的新开发人员(他们想在部署之前在本地测试他们的图像)和任何类型的基于集群的部署系统(Swarm、Kubernetes)也很重要,您只想部署一个图像而不是还必须在部署系统框架之外手动部署代码。

另一种选择是使用 multi-stage build feature。创建一个安装依赖项的中间构建,然后将文件夹复制到生产映像(第二个构建阶段)。这也为您提供了选项 3 的好处。

这取决于您构建中的哪一步成本更高并且可以从缓存中获益。比较以下内容:

Dockerfile A

来自 Ubuntu:16.04

安装Python、Pip等。 添加 requirements.txt 运行 点安装

运行 我的构建步骤很昂贵。

Dockerfile B

FROM Ubuntu:16.04 中级 安装 Python、Pip 等。 添加 requirements.txt 运行 点安装

来自 Ubuntu:16.04

运行 我的构建步骤很昂贵。

COPY --from=intermediate /pip-packages/ /pip-packages/

在第一种情况下,触摸您的 requirements.txt 将强制进行完整构建。在第二种情况下,您昂贵的构建步骤仍然被缓存。中间构建仍在运行,但我认为这不是这里昂贵的步骤。