用docker部署python,图片太大

mat*_*att 5 python amazon-web-services docker

我们构建了一个使用大量库(numpy、scipy、张量流等)的大型 python 存储库,并通过 conda 环境管理这些依赖项。基本上,我们有很多开发人员做出贡献,并且任何时候有人需要一个新的库来完成他们正在开发的东西,他们就会“conda 安装”它。

快进到今天,现在我们需要部署一些使用我们的 repo 的应用程序。我们正在使用 docker 进行部署,但发现这些图像非常大并导致一些问题,例如 10+ GB。然而,每个单独的应用程序仅使用 environment.yml 中所有依赖项的一个子集。

是否有一些简单的策略来处理这个问题?从某种意义上说,我需要知道每个应用程序的依赖关系,但我不确定如何以自动方式执行此操作。

这里的任何帮助都会很棒。我对整个 AWS、Docker 和 python 部署都不熟悉……我们真的是一群需要扩展我们软件的工程师和科学家。我们有一些有效的方法,似乎必须有更好的方法。

ely*_*ely 3

首先看看是否有简单的方法可以缩小映像,例如使用 Alpine Linux 并非常小心使用操作系统包管理器安装的内容,并确保仅在真正需要时才允许安装依赖项或推荐项目,并且清理并安装删除诸如包列表之类的工件、您可能不需要的大东西(例如 Java 等)。

基本的 Anaconda/Ubuntu 镜像大小约为 3.5GB,因此通过大量额外安装大量第三方软件包,您可以获得高达 10GB 的大小,这并不疯狂。在生产图像处理应用程序中,我通常使用 3GB 到 6GB 范围内的 Docker 图像,这些大小是在我们对容器进行了大量优化之后的。

对于有关拆分依赖项的问题,您应该为每个不同的应用程序提供自己的包定义,基本上是一个 setup.py 脚本和一些其他详细信息,包括在 pip 的requirements.txt 和/或 conda 的environment.yaml 的一些组合中列出的依赖项。

如果您在某个文件夹/存储库中有项目 A,在另一个文件夹/存储库中有项目 B,您希望人们能够轻松地执行类似pip install <GitHub URL to a version tag of Project A>conda env create -f ProjectB_environment.yml或某些操作,瞧,该应用程序已安装。

FROM然后,当您部署特定应用程序时,让一些 CI 工具(例如 Jenkins)使用从瘦 Alpine/任何容器开始的线路为该应用程序构建容器,并且对该项目的依赖文件执行 conda install 或 pip install ,并且不是所有其他人。

这还有一个好处,即多个不同的项目甚至可以在同一组库之间声明不同的版本依赖关系。也许项目 A 已准备好升级到最新、最好的 pandas 版本,但项目 B 需要进行一些重构,然后团队才能测试该升级。这样,当 CI 为项目 B 构建容器时,它将有一个包含一组版本的 Python 依赖文件,而在项目 A 的文件夹或源代码存储库中,它可能会有不同的东西。