最小化使用nix构build的Docker容器大小

我使用nix的dockerTools python应用程序打包到dockerTools ,除了图像大小以外,所有内容都很好。 Python本身大约是40Mb,如果你添加numpypandas ,它将会有几百兆,而应用程序代码只有〜100Kb。

我看到的唯一的解决scheme是将依赖关系包装在单独的图像中,然后inheritance主关系,不会修复大小,但至less我不需要在每次提交时都传输巨大的图像。 此外,我不知道如何做到这一点,我应该使用一些与pythonPackages.buildEnv形象,或build立与pythonPackages.buildEnv环境和附加我的​​应用程序吗?

有一些通用的解决scheme是非常好的,但python特定的将是很好的。 即使你有不完善的解决scheme,请分享。

好吧,从fromImage attr为buildImage我分裂成巨大的依赖层和小的应用程序代码层一个巨大的层。 我不知道是否有任何方法将这个胖依赖层移动到单独的图像,所以我可以分享我的其他项目?

没有必要将您的依赖关系打包在一个单独的映像中,并inheritance它,尽pipe这不会造成伤害。

您只需确保将您的应用程序代码添加为Dockerfile中最后一个步骤。 每个命令都有自己的层次,所以如果你只是改变你的应用程序代码,那么可以从caching中使用该更改之上的所有层。

Docker Images和Layers文档中的例子:

dockerfile

 FROM ubuntu:15.10 COPY . /app RUN make /app CMD python /app/app.py 

包含四个不同的层。 如果您只修改最后一行,则只有该图层和下面的所有图层才需要传输。 推或拉时,您将看到4b0ba2c4050a: Already exists已从caching中使用的图层旁边4b0ba2c4050a: Already exists 。 按照这种方法,你不会得到一个更小的图像,但正如你所说,你不必每次更改都拉大图像。

谷歌search后,阅读dockerTools代码我结束了这个解决scheme:

 let deps = pkgs.dockerTools.buildImage { name = "deps"; content = [ list of all deps here ]; }; in pkgs.dockertools.buildImage { name = "app"; fromImage = deps; } 

这将构build两层泊坞窗图像,其中一个将是依赖关系,另一个是应用程序。 另外似乎fromImage值可能是fromImage结果,应该给你相同的结果(如果我正确理解代码),但我无法检查它。