我可以运行docker图像的中间层吗?

当我从存储库中获取一个docker镜像时,看到它用一些id拉动了一堆图层,但是当我尝试使用docker运行它时,它告诉我它找不到它。

我的问题是这样的,我可以运行一个docker图像的某一层,我可以通过docker历史<image_id>看到,就像古生物学家挖掘一些有趣的东西?

我试过了什么:

docker pull ruby Using default tag: latest latest: Pulling from library/ruby 693502eb7dfb: Already exists 081cd4bfd521: Already exists 5d2dc01312f3: Already exists 54a5f7da9a4f: Pulling fs layer 168cf3f33330: Pulling fs layer 021d84fef638: Pulling fs layer 168c3c107cd1: Waiting f001b782a027: Waiting 

然后 :

 docker run --rm -it 5d2dc01312f3 bash Unable to find image '5d2dc01312f3:latest' locally 

当我拉着一个我已经构build并发布的图像时,这个问题就困扰着我,我可以清楚地看到,一个图层几乎有1.2go的大小,这是我从机器复制一些文件,我用来build立图像和下一层我清理和删除一些这些文件,因为我正在清洗图像,但图像的总大小约为1.5go,这意味着大胖层是1.2go在那里,我只是想看看我是否可以偷看到这个脂肪层。

是的,这是可能的,但是如果你使用docker> = 1.10只有自build图像。 例如docker history ruby将输出<missing>除了最顶层之外的所有,因为它们没有标签。 如果你自己build立,他们会有一个标签,你可以像平常一样开始

不,你不能运行一个图层,你只能运行一个图像。 所以这取决于是否存在与此图层相关的中间图像!

这是一个典型的情况:

  1. 您在主机上构build一个图像:将为此图层创build一个中间图像(这是为docker构buildcaching完成的)
  2. 您将图像推送到registry:只有最后的图像被推送(它引用所有图层),但没有中间图像被推送。
  3. 您在另一个主机上拉取图像:最终图像(包含所有图层)现在可以在其他docker主机上使用。 您可以通过运行docker history <image-id>来显示其图层

您拉取图像时看到的摘要是图层的摘要,它们不是中间图像。

docker history输出的image列中的<missing>值意味着没有图像与这些图层相关联,因此没有任何东西可以运行。

docker守护进程将不允许访问这些层,除非该映像是在相同的docker主机上构build的(或dockercaching是分布式的 )

您可以在explain-docker-image-id处阅读更多关于图层的信息