相信自己的微小Docker映像*

[参考美国儿童的童话故事《可能的小引擎》-约。 每人] *



如何根据需要自动创建微小的Docker映像


不寻常的痴迷


在过去的几个月中,我一直痴迷于:我可以减少多少Docker镜像,以使应用程序正常工作?


我知道这个主意很奇怪。


在深入研究细节和技术问题之前,我想解释一下为什么这个问题吸引了我这么多,以及它如何关系到您。


为什么尺寸很重要


通过缩短Docker映像的内容,我们缩短了漏洞列表。 此外,我们使图像更整洁,因为它们仅包含运行应用程序所需的内容。


还有一个小的优势-图像下载速度更快,但是就我而言,这并不重要。


请注意:如果您在乎尺寸,则Alpine外观本身很小,可能会适合您。

无损图像


Distroless项目提供了一些基本的“ distroless”映像;它们不包含程序包管理器,shell或您习惯于在命令行上看到的其他实用程序。 结果,使用像pipapt这样的包管理器将失败:


 FROM gcr.io/distroless/python3 RUN pip3 install numpy 

使用Python 3 Distroless映像的Dockerfile


 Sending build context to Docker daemon 2.048kB Step 1/2 : FROM gcr.io/distroless/python3 ---> 556d570d5c53 Step 2/2 : RUN pip3 install numpy ---> Running in dbfe5623f125 /bin/sh: 1: pip3: not found 

图片中没有点


通常,此问题可以通过多阶段构建来解决:


 FROM python:3 as builder RUN pip3 install numpy FROM gcr.io/distroless/python3 COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.5/ 

多阶段组装


结果是大小为130MB的图像。 还不错! 为了进行比较:默认情况下,Python映像的重量为929MB,“更薄”( 3,7-slim )的重量为179MB,高山( 3,7-alpine )的重量为98.6MB,而示例中使用的基本的distroless映像为50.9兆字节


我们可以正确地指出,在前面的示例中,我们复制了整个目录/usr/local/lib/python3.7/site-packages ,其中可能包含不必要的依赖项。 尽管很明显所有现有的Python基本映像的大小差异都不同。


在编写这些行时,Google distroless不支持许多图像:Java和Python仍处于试验阶段,Python仅存在于2.7和3.5。

微小的图像


让我们回到我对创建小图像的痴迷。


其实,我想看看无损图像是如何工作的。 这个非发行版的项目使用了Google bazel构建bazel 。 但是,要安装Bazel并编写您自己的图像,我不得不出汗(并且老实说,重新设计轮子既有趣又有益)。 我想简化缩小图像的创建:创建图像的操作应该非常简单, 平淡 。 为使您没有任何配置文件,控制台中 <>一行: <>


因此,如果您想创建自己的映像,请知道:有一个独特的docker映像, scratch 。 Scratch是一个“空”的图像,它没有文件,尽管默认情况下它的重量很重-哇! -77个字节。


 FROM scratch 

刮擦图像


临时映像的想法是,您可以从主机上将任何依赖项复制到其中,并在Dockerfile中使用它们(这是将它们复制到apt并从头开始安装的方法),或者稍后在Docker映像实现时使用。 这使您可以完全控制Docker容器的内容,从而完全控制映像的大小。


现在,我们需要以某种方式收集这些依赖项。 现有的工具如apt允许您下载软件包,但它们与当前计算机绑定,最终不支持Windows或MacOS。


因此,我承诺要组装自己的工具,该工具将自动组装可能的最小大小的基本映像,从而仍然可以启动任何应用程序。 我使用Ubuntu / Debian软件包,进行选择(直接从存储库中获取软件包)并递归地找到它们的依赖关系。 该程序应自动下载该软件包的最新稳定版本,以最大程度地降低安全风险。


我称它为fetchy ,因为它可以找到并带来……您需要的东西[ 英文。 “获取”,“带来”-大约 反式 ]。 该工具通过命令行界面工作,但同时提供了API。


为了使用fetchy构建映像( fetchy让我们获取一个Python映像),您只需要使用如下CLI: fetchy dockerize python 。 可能会要求您提供目标操作系统和代码名称,因为fetchy仅使用基于Debian和Ubuntu的软件包。


现在,您可以选择根本不需要的依赖项(在我们的上下文中)并排除它们。 例如,Python依赖于perl,尽管在未安装Perl的情况下也能很好地工作。


结果


使用fetchy dockerize python3.5创建的Python映像仅重35MB(我确信将来可以使它更容易实现)。 事实证明,有了一个平稳的映像,我们设法“节省”了另外15MB。


可以在此处查看所有当前收集的图像。


该项目在这里


如果您没有足够的功能,只需创建一个应用程序-我将很乐意为您提供帮助:)甚至,我目前正在将其他软件包管理器集成到fetchy中,因此不再需要多阶段构建。

Source: https://habr.com/ru/post/zh-CN469947/


All Articles