如何获取构建ID并在`FROM`中指定它?

时间:2018-03-24 15:10:54

标签: docker docker-compose dockerfile

想象一下,我们的Dockerfile中有FROM python:3.6.4。它似乎非常具体,所以我们可以预期,每次Docker在新环境中将此图像作为docker build的一部分下载时,我们都会得到相同的基本图像。

但事实并非如此。在撰写本文时,this Dockerfile(两天前生成)用于图像。构建本身大概也是两天前(因此图像中的apt-get'd包是从那时开始的),尽管https://hub.docker.com/_/python/https://store.docker.com/images/python都没有显示构建细节。但是,例如,https://hub.docker.com/r/aslushnikov/latex-online/builds/列出了构建。

因此,从同一个Dockerfile构建的两个图像可能会有所不同。这个问题的一个小例子:两天前构建的图像可能会在pip install期间生成警告(因为它有点9.0.2但可用9.0.3),而今天构建的图像可能不会(因为它已经有了9.0.3)。当然,这个具体问题(这是差异,而不是警告本身)可以使用pip install --disable-pip-version-check来修复,但更多问题是可能的。

据我了解,几乎Docker的重点是重复性,所以在基本图像规范这样常见的地方看到泄漏有点奇怪。有时这可能是更好的(当我们想要最新的修复时)但有时候不是(当我们想要可重复性时)。

理论上,每个图像都可以用git等跟踪,但这是最后的选择。 Dockerfile中的ID,docker-compose.ymldocker的参数显然会更好。问题是:从哪里获取此ID以及放置它的位置?

1 个答案:

答案 0 :(得分:2)

Docker有两种识别图像的机制。

  1. 第一个是众所周知的标记机制,它不能保证确定性部署,因为标记可以重用来指向其他图像。
  2. 第二个是不太熟悉的不可变标识符机制。不可变标识符本质上是SHA256哈希摘要。标签可以重复使用,但不可变的标识符永远不会。
  3. 了解如何通过其不可变标识符提取图像:https://docs.docker.com/engine/reference/commandline/pull/#pull-an-image-by-digest-immutable-identifier