最小化使用Nix的dockertools.buildImage建立的docker容器大小

问题描述 投票:1回答:2

我正在用nix的dockerTools将python应用程序打包到docker中,除了图像大小,其他都很好。 Python本身约为40Mb,如果添加numpypandas,它将只有几百兆字节,而应用程序代码仅为〜100Kb。

我看到的唯一解决方案是将依赖项打包在单独的映像中,然后从中继承主要映像,它不会固定大小,但是至少我不需要在每次提交时都传输大型映像。另外我也不知道该怎么做,我应该在nix上使用一些图像,还是在pythonPackages.buildEnv上构建环境并附加我的应用程序?

拥有一些通用的解决方案会很棒,但是特定于python会很好。即使您的解决方案不完善,也请分享。

确定,将fromImage的属性设为buildImage,我将一个巨大的层划分为巨大的依赖层和小的应用程序代码层。我想知道是否有任何方法可以将胖依赖层移动到单独的图像中,以便我可以在其他项目中共享它吗?

python docker nix
2个回答
0
投票

没有必要将依赖项打包在单独的映像中并继承它,尽管这样做不会造成损害。

您需要做的就是确保将应用程序代码添加为Dockerfile中的最后一步。每个命令都有其自己的层,因此,如果仅更改应用程序代码,则可以从缓存中使用更改后的所有层。

Docker Images and Layers文档中的示例:

dockerfile

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

包含四个不同的层。如果仅修改最后一行,则仅必须传输该层及其下的所有层。推或拉时,您会在缓存中正在使用的图层旁边看到4b0ba2c4050a: Already exists。采用这种方法,您不会得到较小的图像,但是正如您所说的,您不必每次更改都拉大图像。


0
投票

搜索了一下并阅读了dockerTools代码后,我以这种解决方案结束了:

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

这将构建两层docker映像,其中之一是依赖关系,另一层是应用程序。似乎fromImage的值可能是pullImage的结果,应该可以得到相同的结果(如果我正确理解了代码),但我无法对其进行检查。

© www.soinside.com 2019 - 2024. All rights reserved.