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

Moh*_*han 1 mkdir docker dockerfile

运行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 Code Online (Sandbox Code Playgroud)

第一个RUN命令成功创建了一个文件,但是第二个命令找不到该文件:

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
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?(注意:这是一个玩具示例,但是真正的问题在于,安装到Maven存储库中的JAR似乎在各层之间消失了。)

BMi*_*tch 5

的上游行家图像此目录定义为体积。映像执行此操作后,将无法可靠地更改映像中的该目录。

从他们的Dockerfile中:

ARG USER_HOME_DIR="/root"
...
VOLUME "$USER_HOME_DIR/.m2"
Run Code Online (Sandbox Code Playgroud)

该Dockerfile文档描述了这种行为:

从Dockerfile中更改卷:如果在声明了卷后有任何构建步骤更改了卷中的数据,则这些更改将被丢弃。

您的选择是:

  • 使用另一个目录进行构建
  • 要求上游映像删除此VOLUME定义
  • 在没有此定义的情况下构建自己的映像(很容易分叉他们的仓库并自己构建)

有关更多详细信息,您可以查看我的一篇旧博客文章,内容涉及此行为及其带来的问题。