基本上我有一堆来自gradle build的第三方jar文件被复制到external
目录。
这些罐子几乎从未改变过,但Docker不知何故不想缓存该层。
我的Docker文件非常简单:
RUN mkdir -p /opt/app
WORKDIR /opt/app
COPY app.jar .
COPY project /opt/app/project
COPY external /opt/app/external
EXPOSE 2550 7000
md5sum
目录中所有jar
个文件和大小的external
是相同的。 stat
仅显示inode
在这些文件上有所不同(当然需要文件时间,但根据docker docs mtime在比较时会被忽略)。
然而,如果我查看泊坞历史,我发现该层未被缓存:
标签:test-1
1be1e9a7084b 17 hours ago /bin/sh -c #(nop) EXPOSE 2550/tcp 7000/tcp 0B
e593cf804634 17 hours ago /bin/sh -c #(nop) COPY dir:b2ed14f41affcee... 60.4MB
a55be55e6e68 17 hours ago /bin/sh -c #(nop) COPY dir:f1abbe11a6a64fe... 566kB
e8823ec84dfb 17 hours ago /bin/sh -c #(nop) COPY file:ba5ef09e42eda4... 523kB
041f6f6957b5 17 hours ago /bin/sh -c #(nop) WORKDIR /opt/app 0B
15e4c78e545c 17 hours ago /bin/sh -c mkdir -p /opt/app 0B
标签:test-2
aacb13926d18 17 hours ago /bin/sh -c #(nop) EXPOSE 2550/tcp 7000/tcp 0B
7ebe12849fad 17 hours ago /bin/sh -c #(nop) COPY dir:b2ed14f41affcee... 60.4MB
4bf898283d11 17 hours ago /bin/sh -c #(nop) COPY dir:f1abbe11a6a64fe... 566kB
886630b2a05a 17 hours ago /bin/sh -c #(nop) COPY file:5ad60a31d9e72d... 523kB
041f6f6957b5 17 hours ago /bin/sh -c #(nop) WORKDIR /opt/app 0B
15e4c78e545c 17 hours ago /bin/sh -c mkdir -p /opt/app 0B
那么我如何强制docker重用一个几乎永远不会改变的第三方罐子? 是因为在构建之后每次都重新创建外部目录吗?那还有其他方法吗?
答案 0 :(得分:1)
将COPY external / opt / app / external图层移到顶部,作为第一个COPY语句。如果一个Docker图层已更改,则下面的图层将无效。将最静态的COPY和命令移到顶部,将经常更改的命令移到Dockerfile的底部。