基本上我有一堆来自gradle构建的第三方jar文件,这些文件被复制到external
目录中。
这些 jar 几乎永远不会改变,但 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
该external
目录中所有jar
文件和大小的md5sum
是相同的。该stat
仅显示这些文件上的inode
不同(当然需要文件时间,但根据 docker 文档,比较时会忽略 mtime(。
然而,如果我查看 docker 历史记录,我发现该层没有缓存:
标签: 测试-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
标签: 测试-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 重用那些几乎永远不会改变的第三方 jar 的层呢? 是因为每次构建后都会重新创建外部目录吗?还有其他方法吗?
将 COPY外部/opt/app/external 层移动到顶部,作为第一个 COPY 语句。如果一个 Docker 层已更改,则以下层将失效。将最静态的副本和命令移到 Dockerfile 的顶部,将频繁更改的命令移到 Dockerfile 的底部。