docker工人 – 如何caching添加目录?

基本上我有一堆来自gradle build的第三方jar文件被复制到external目录。
那些jar子几乎不会改变,但是Docker不知道怎么caching那个图层。

我的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历史,我发现图层没有被caching:

标签: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重新使用那些几乎不会改变的第三方jar子的图层呢? 是否因为外部目录每次构build后都会重新创build? 有没有其他方法?

作为第一个COPY语句,将COPY外部/ opt / app / external图层移到顶部。 如果一个Docker图层发生了变化,则下面的图层将失效。 将最静态的COPY和命令移到顶部,并将频繁更改的命令移动到Dockerfile的底部。