如何传输单个图像层以便稍后重build图像?

由于docker图像是由图层构成的,DockerFile创build的每个图像基本上都是一个图层集合(每个DockerFile线一个图层),我想知道是否有可能提取相关图层,传输图像并使用这些图层重build图像一个基本的形象。

通过这种方式,在服务器上安全地创build单独的图像,只传输相关更改并重新构build最终的图像,对于各种场景(包括我们正在考虑的场景)来说都是非常好的select。

Docker的文件系统和图层pipe理非常聪明,可以为您做到这一点。

考虑这种情况,例如…创build一个Dockerfile FROM node:6.9.5并添加一些新的configuration或库或其他。 发布产生的图像到Dockerhub …只是为了举例说它叫“我的用户/我的图像”。

现在去另一台已经有node:6.9.5计算机node:6.9.5图像。 创build一个新的Dockerfile构buildFROM my-user/my-image 。 当你build立这个镜像时,如果你已经下载了这个镜像,Docker将不会再下载node:6.9.5镜像。

这是事情,虽然… Docker图像层被明确地绑在一起。

如果图像中有三个图层(图层a,图层b,图层c),则不能单独提取图层b。 这是没有意义的,因为图层-b依赖于图层-a的确切状态。 同样,layer-c依赖于layer-b来工作。

每个连续的层只是前一层和Dockerfile下一条指令的结果之间的差异。

所以你想要做什么 – 提取图层的想法 – 都不会按照你想象的方式工作,并且已经被Docker自己处理了。

也许docker历史是你在找什么。 它为您提供了每一层,通过触发它们的命令进行更改:

 docker history myimagename be51b77efb42 8 days ago /bin/sh -c apt-get update && apt-get install 338.3 MB 4b137612be55 6 weeks ago /bin/sh -c #(nop) ADD jessie.tar.xz in / 121 MB 

请参阅: docker历史

我使用的简单直版本是导出基本上折叠所有图层的docker容器/图像到一个单一的图层。 通过比较两个不同的图像(基本图像+当前图像),可以轻松地计算文件系统差异,并创build一个文件系统“补丁”,可以基于基本图像分发和使用,以重新创build当前图像。 所有的左边是提交当前的容器,我们完成了。