在一月份,我使用'FROM node:10.12.0'构建了我的应用程序版本。
信号量构建过程日志显示如下:
d8268e1e433b: Pull complete
Digest: sha256:00a7fb3df8e94ed24f42c2920f132f06e92ea5ed69b1c5e53c4bb3d20e85a3e2
Status: Downloaded newer image for node:10.12.0
---> a2b9536415c2
Step 2/11 : RUN apt-get update
---> Running in f9bd6b252e7f
Get:1 http://security.debian.org jessie/updates InRelease [44.9 kB]
Ign http://deb.debian.org jessie InRelease
Get:2 http://deb.debian.org jessie-updates InRelease [145 kB]
Get:3 http://security.debian.org jessie/updates/main amd64 Packages [790 kB]
Get:4 http://deb.debian.org jessie Release.gpg [2420 B]
Get:5 http://deb.debian.org jessie-updates/main amd64 Packages [23.0 kB]
Get:6 http://deb.debian.org jessie Release [148 kB]
Get:7 http://deb.debian.org jessie/main amd64 Packages [9098 kB]
Fetched 10.3 MB in 2s (3476 kB/s)
Reading package lists...
刚才我试图建立一个新的版本。自一月份以来,我从未接触过这些构建文件或构建过这些文件。我以为一切都会正常。但是我得到了这个:
d8268e1e433b: Pull complete
Digest: sha256:00a7fb3df8e94ed24f42c2920f132f06e92ea5ed69b1c5e53c4bb3d20e85a3e2
Status: Downloaded newer image for node:10.12.0
---> a2b9536415c2
Step 2/11 : RUN apt-get update
---> Running in e903db31c4a6
Get:1 http://security.debian.org jessie/updates InRelease [44.9 kB]
Ign http://deb.debian.org jessie InRelease
Get:2 http://deb.debian.org jessie-updates InRelease [7340 B]
Get:3 http://deb.debian.org jessie Release.gpg [2420 B]
Get:4 http://deb.debian.org jessie Release [148 kB]
Get:5 http://security.debian.org jessie/updates/main amd64 Packages [825 kB]
Get:6 http://deb.debian.org jessie/main amd64 Packages [9098 kB]
Fetched 10.1 MB in 4s (2509 kB/s)
W: Failed to fetch http://deb.debian.org/debian/dists/jessie-updates/InRelease Unable to find expected entry 'main/binary-amd64/Packages' in Release file (Wrong sources.list entry or malformed file)
E: Some index files failed to download. They have been ignored, or old ones used instead.
The command '/bin/sh -c apt-get update' returned a non-zero code: 100
因此,我了解了Docker Digests。使用Digests应该能够拥有完全不变的版本。但是...这两个版本的摘要是相同的!
我是否正确地认为在“ FROM”语句中使用摘要对我没有帮助?
这两个不同的版本如何具有相同的摘要?
答案 0 :(得分:1)
您正确地认为,由于摘要匹配,因此要在其上面构建的图像与以前相同。问题在于,这并不意味着Dockerfile中的后续指令每次都会以完全相同的方式运行。在这种情况下,当您致电apt-get update
时,您将与远程apt仓库联系。我对这个过程一无所知,但基本上看来已经完成了一些更新,破坏了与该图像的兼容性。每当您具有这样的远程依赖项(apt-get呼叫,下载文件等)时,它们可能会更改或变得不可用,即使基础映像相同,也会导致构建失败。
例如,如果我有这个Dockerfile
FROM ubuntu:latest
RUN curl http://some.url --output some.file
每次运行构建时,除非我缓存了图层,否则http://some.url必须可用,否则即使底层的ubuntu映像相同,构建也会失败。