使用conda-pack缩小您的Conda Docker映像

2020-09-12 02:50:29

如果您正在构建一个基于conda的Docker映像,那么生成的图像可能会很大。例如,稍后我将展示一个仅包含Python3.8和NumPy的简单图像是如何超过950MB的!

大图像会浪费带宽、磁盘、时间和CPU:如何将图像变小?

在本文中,我将展示一种方法,通过将conda-pack工具与多阶段构建相结合,在仅使用Python和NumPy的示例中,图像缩小到330MB,几乎小了三分之二。

如果您不熟悉多阶段构建,我建议您先阅读我对多阶段构建的介绍。

让我们创建一个只有几个依赖项的标准Conda Docker映像。以下是环境.yml:

这里是Dockerfile;我们安装了Python3.8和NumPy,当我们运行它导入的NumPy映像时,它会导入NumPy以确保一切正常。(如果您不熟悉conda运行,您可能需要阅读我关于在Docker中激活conda环境的文章。)。

从Continumio/miniconda3复制环境.yml。运行Conda环境创建-f环境.yml入口点[";Conda";,";运行";,";-n";,";Example";,\";python";,";-c";,\";import numpy;print(';Success!';)";]。

注意:在讨论的主题之外,本文中的Dockerfile不是最佳实践的示例,因为增加的复杂性会模糊本文的要点。为了确保您编写的是安全、正确、快速的Docker文件,请参考我的快速入门指南,其中包括从安全性到性能的60多个最佳实践。

生成的图像是970MB,相当惊人地大。所有的磁盘空间都到哪里去了?

安装Conda工具链的基本环境占用大量空间;它有自己的Python副本,例如,本例中的Python3.7。

第二个原因意味着我们使用的基本映像Continumio/miniconda3是430MB。作为比较,python:3.8-slm-buster映像是115MB,它已经包含了我们想要使用的Python版本。

增加大小的第一个原因对于包管理器来说是相当标准的,通常可以通过配置或目标明确的rm-rf来解决。然而,第二个问题是特定于conda的:基本conda环境是安装包所必需的,但是一旦我们运行代码,它实际上不会添加太多内容。

进入conda-pack,这是一个工具,可以让您将conda环境打包到独立环境中,而不需要conda工具链。一旦我们以这种方式打包了我们的环境,我们就可以将其复制到只包含该自包含环境的新映像中。

同样,如果您不熟悉多阶段构建,我建议您先阅读我对多阶段构建的介绍。

#构建阶段映像:from Continumio/miniconda3 as build#正常安装软件包:copy Environmental ment.yml。运行conda env create-f Environment。yml#install conda-pack:run conda install-c conda-forge conda-pack#使用conda-pack在/venv中创建独立环境#in/venv:运行conda-pack-n示例-o/tmp/env.tar&;&;\mkdir/venv&;&;cd/venv&;&;tar xf/tmp/env.tar&;&。我将venv放在相同的路径中,它将位于最终映像中,#所以现在修复路径:run/venv/bin/conda-unpack#运行时阶段映像;我们可以使用debian作为#基本映像,因为conda环境也为我们包含了Python#。来自Debian:Buster作为运行时#copy/venv来自上一阶段:copy--from=build/venv/venv#运行映像时,在#激活的环境下运行代码:shell[";/bin/bash";,";-c";]入口点来源/venv/bin/activate&;&;\python-c&34;import numpy;print(';成功!';)";

如果我们构建映像,得到的映像要小得多,而且它仍然工作得很好:

$docker映像build-t condapack。...$docker CONTAINER运行condapack成功!$docker image ls condapack存储库标记映像ID SIZEcondapack最新的6e7906bd0634 330MB。

Conda是一个有趣的打包系统,因为它包含了运行程序所需的所有东西,除了标准的C库之外。因此,当我们在Environment.yml中安装python=3.8包时,它会安装Python和它需要的所有C库。

当我们使用conda-pack将我们的conda环境打包到一个不需要conda的隔离环境中时,结果是一个目录,其中包含可以在几乎任何Linux发行版上运行的程序,因此我们只需将该目录复制到一个普通的旧的小Debian映像上,并获得一个独立运行的应用程序。

如果您在您的Docker映像中使用conda,那么conda-pack是一种缩小映像的简单方法。但是,请务必阅读我关于快速多阶段构建的文章;简单地使用多阶段构建会导致CI中的重建非常慢。

了解如何构建快速、可投入生产的Docker映像-阅读针对Python的Docker打包指南的其余部分。

从为您节省时间的快速构建到保证您安全的安全最佳实践,您如何快速获得打包Python应用程序用于生产所需的专业知识?

通过使用Docker Production QuickStart上的Python,快速了解最佳实践。

你需要在就业市场上保持竞争力--但是要学的东西太多了,你不知道从哪里开始。

加入2300多名Python开发人员和数据科学家的行列,学习实用工具和技术,从Docker打包到Python最佳实践,每周在您的收件箱中都会有一篇免费的新文章。