Docker:创build的文件在层之间消失

运行Docker版本17.06.0-ce,编译02c1d87,我有一个dockerfile,看起来像这样:

FROM maven:3.5.2-jdk-8-alpine as builder RUN chmod -R 777 /root/.m2 &&\ mkdir -p /root/.m2/repository/com/foo/bar &&\ echo "Text" > /root/.m2/repository/com/foo/bar/baz.txt &&\ ls -R -a -l /root/.m2/repository/com/foo RUN ls -R -a -l /root/.m2/repository/com/foo 

第一个RUN命令成功创build一个文件,但第二个命令找不到它:

 Step 1/46 : FROM maven:3.5.2-jdk-8-alpine as builder ---> 293423a981a7 Step 2/46 : RUN chmod -R 777 /root/.m2 && mkdir -p /root/.m2/repository/com/foo/bar && echo "Text" > /root/.m2/repository/com/foo/bar/baz.txt && ls -R -a -l /root/.m2/repository/com/foo ---> Running in a1c0fd142856 /root/.m2/repository/com/foo: total 12 drwxr-xr-x 3 root root 4096 Nov 30 13:32 . drwxr-xr-x 3 root root 4096 Nov 30 13:32 .. drwxr-xr-x 2 root root 4096 Nov 30 13:32 bar /root/.m2/repository/com/foo/bar: total 12 drwxr-xr-x 2 root root 4096 Nov 30 13:32 . drwxr-xr-x 3 root root 4096 Nov 30 13:32 .. -rw-r--r-- 1 root root 5 Nov 30 13:32 baz.txt ---> b997ccbfd5b0 Step 3/46 : RUN ls -R -a -l /root/.m2/repository/com/foo ---> Running in 603671c87ecc ls: /root/.m2/repository/com/foo: No such file or directory The command '/bin/sh -c ls -R -a -l /root/.m2/repository/com/foo' returned a non-zero code: 1 

这是怎么回事? (注意,这是一个玩具的例子,但是实际上问题在于安装到Maven仓库中的JAR似乎在各层之间消失了。)

上游的maven映像将这个目录定义为一个卷。 一旦图像做到这一点,就无法可靠地对图像中的该目录进行更改。

从他们的Dockerfile:

 ARG USER_HOME_DIR="/root" ... VOLUME "$USER_HOME_DIR/.m2" 

Dockerfile文档描述了这种行为:

更改Dockerfile中的音量:如果任何构build步骤在声明后更改了音量内的数据,则这些更改将被丢弃。

您的select是:

  • 为您的构build使用另一个目录
  • 请求上游图像删除此VOLUME定义
  • 没有这个定义构build自己的图像(这是相当容易的叉他们的回购和做你自己的构build)

有关更多详细信息,您可以看到我的旧博客文章有关此行为和它创build的问题。