Docker - 如何缓存添加的目录?

时间:2017-07-02 11:19:33

标签: java docker

基本上我有一堆来自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重用一个几乎永远不会改变的第三方罐子? 是因为在构建之后每次都重新创建外部目录吗?那还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

将COPY external / opt / app / external图层移到顶部,作为第一个COPY语句。如果一个Docker图层已更改,则下面的图层将无效。将最静态的COPY和命令移到顶部,将经常更改的命令移到Dockerfile的底部。