最小化使用nix构build的Docker容器大小
我使用nix的dockerTools
python应用程序打包到dockerTools
,除了图像大小以外,所有内容都很好。 Python本身大约是40Mb,如果你添加numpy
和pandas
,它将会有几百兆,而应用程序代码只有〜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
结果,应该给你相同的结果(如果我正确理解代码),但我无法检查它。