2017-07-02 105 views
1

基本上我有一堆来自Gradle构建的第三方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 

所有jar文件和大小在external目录的md5sum是相同的。 stat只显示inode在这些文件上有所不同(当然期待文件时间,但根据docker文档,mtime在比较时会被忽略)。

然而,如果我看搬运工历史,我看到,该层没有被缓存:

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

回答

1

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

+0

恩,我现在感觉很蠢,谢谢! – gerasalus