码头工人 - 如何缓存添加的目录?



基本上我有一堆来自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 的底部。

最新更新