Dockercaching置换RUN指令

如果从Dockerfile构build一个映像,将排列2个RUN指令:

  • 创build一个全新的图像(新的散列)相同的caching图层排列?
  • 没有创build新映像,因为排列不会影响同一组RUN指令的内部版本。

RUN指令1取代RUN指令2
RUN指令2被RUN指令1取代

如果您将RUN指令置换,将创build一个新的图像。 这里是一个例子:

FROM alpine RUN echo abc RUN echo cdf 

运行docker image build -t image1 . 然后排列RUN命令并运行docker image build -t image2 . 。 你会发现image1和image2有不同的ID。

鉴于这个最小的Dockerfile:

 FROM busybox RUN echo text1 > file1 RUN echo text2 > file2 

当你运行:

 docker build . -t my-image docker inspect my-image 

那么你会得到:

 "RootFS": { "Type": "layers", "Layers": [ "sha256:08c2295a7fa5c220b0f60c994362d290429ad92f6e0235509db91582809442f3", "sha256:2ce4cb064fd2dc11c0b6fe08ffed6364478f6de0a1ac115d8aa01005b4c2921a", "sha256:b4f880ce3a2172db2a614faf516c172d1e205bbf293daaee0174c4a5bd93d5f3" ] } 

现在再尝试排列的命令,build立和检查你得到的图像:

 "RootFS": { "Type": "layers", "Layers": [ "sha256:08c2295a7fa5c220b0f60c994362d290429ad92f6e0235509db91582809442f3", "sha256:812b39039b60290f4aa193d8f8bf03fbd13020dd5cfa6e6638feb68dac72cf9c", "sha256:451c384fb837aa70e446a36d3571123144cb497a42819b7a30348e7d49b24a0b" ] } 

注意:如果您的命令不修改文件系统,例如RUN echo text您的映像将只有一个图层sha256:08c2295a7fa5c220b0f60c9943 62d290429ad92f6e0235509db91582809442f3 ,表示空的FS。

结论:不仅创build了一个新的图像,而且还创build了新图层(即新图像不仅仅是现有图层的重新sorting列表)。 这可能是因为该图层不仅包含内容,还包含其父散列。

有关更多详细信息,请参阅http://windsock.io/explaining-docker-image-ids/