Docker: 创建的文件在层之间消失
Docker: created files disappear between layers
运行 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
第一个运行命令成功创建文件,但是第二个命令找不到:
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 似乎在层之间消失了。)
upstream maven image 将此目录定义为一个卷。一旦图像执行此操作,您就无法可靠地更改图像中的该目录。
来自他们的 Dockerfile:
ARG USER_HOME_DIR="/root"
...
VOLUME "$USER_HOME_DIR/.m2"
Dockerfile documentation 描述了此行为:
Changing the volume from within the Dockerfile: If any build steps change the data within the volume after it has been declared, those changes will be discarded.
您的选择是:
- 为您的构建使用另一个目录
- 请求上游图像删除这个
VOLUME
定义
- 在没有此定义的情况下构建您自己的映像(分叉他们的存储库并进行您自己的构建相当容易)
有关更多详细信息,您可以查看我关于此行为及其造成的问题的旧 blog post。
运行 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
第一个运行命令成功创建文件,但是第二个命令找不到:
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 似乎在层之间消失了。)
upstream maven image 将此目录定义为一个卷。一旦图像执行此操作,您就无法可靠地更改图像中的该目录。
来自他们的 Dockerfile:
ARG USER_HOME_DIR="/root"
...
VOLUME "$USER_HOME_DIR/.m2"
Dockerfile documentation 描述了此行为:
Changing the volume from within the Dockerfile: If any build steps change the data within the volume after it has been declared, those changes will be discarded.
您的选择是:
- 为您的构建使用另一个目录
- 请求上游图像删除这个
VOLUME
定义 - 在没有此定义的情况下构建您自己的映像(分叉他们的存储库并进行您自己的构建相当容易)
有关更多详细信息,您可以查看我关于此行为及其造成的问题的旧 blog post。