2014-03-31 150 views
1

我使用码头为我们的码头应用程序。Docker - 减少拉的大小

它具有以下的层:

  1. 全球依赖性
  2. 应用依赖性
  3. 应用
  4. APP-配置 - 5个不同的配置。

每个图层都在Dockerfile的'FROM'行中有上一层。 通常只有appapp-config被更改。 如果我改变*-dependencies图片中的某些东西,我会在构建脚本中取消注释它们,以便它们得到更新。

在构建脚本结束时,我做的事:

sudo docker tag app-config-1 my_registry:5000/app-config-1:$version 
sudo docker push my_registry:5000/app-config-1 

然后在目标主机上我做的:

docker pull my_registry:5000/app-config-1:$version 

这种设置就像一个魅力 - 当有到*-dependencies没有变化只需2分钟即可创建5张图像。

问题是拉图像。即使只有app图层发生变化,即大约100M,但似乎pull会从所有父图像下载数据,即使它们未被重建。我不得不花费大量的数据来做一些小小的改动。

我的工作流程中是否有一些错误?我能以某种方式优化过程吗?

谢谢!

+0

你可以尝试标记中间步骤并明确使用它们吗?步骤2的输出,称为“appdep”,然后在步骤3中使用'FROM appdep',然后将该输出标记为“app”,然后在5的最后一个循环中,对每个配置使用'FROM app'。 – Andy

+0

>“如果我在* -dependencies图像中更改某些内容,我会在构建脚本中取消它们的注释,以便它们得到更新。”缓存机制没有照顾到你吗? – qkrijger

+0

您使用的是哪个版本的Docker?我认为Docker不会让你的docker推my-registry:5000/my-image:image-version(它会在':image-version'部分)。我刚刚尝试0.9,并且足够公平,'docker push localhost:5000/busybox:42'告诉我'2014/04/04 12:50:06存储库名称无效(busybox:42),只有[a-z0-9 -_。]被允许。 – jpetazzo

回答

1

就有人有类似的问题:

你可以做调查对图像的变化做

docker history my_registry:5000/app-config-1 

它会告诉你所有层,并在每个命令后的大小差异。

在我的情况下,我在第一步中添加了一个巨大的文件夹(很少执行)。 问题是在后面的步骤之一中我有一个命令更改此文件夹的权限。这使得码头工人创建了一个包含所有文件的新图层(大约400M)。

现在我在添加文件夹后立即更改第一步中的权限,因此图像的大小明显减小。

0

此外,您现在可以使用ImageLayers.io以视觉方式检查图像&以帮助了解额外尺寸的原因。