Dockerfile可以将文件复制到声明的卷中,但是RUN无法创建文件吗?

时间:2018-04-24 11:10:55

标签: docker dockerfile

我一直在关注卷的一些奇怪的行为。我们有一个包含数据库的容器,并且应该从包含数据的主机绑定装入文件夹。我正在尝试创建一个带有测试数据的子容器,因为它仅用于测试。

这要求在构建步骤中,从主机复制一些数据,然后运行一些创建其他文件的脚本。我注意到,但是当我查看正在运行的容器时,只存在复制的文件,而脚本创建的文件则不存在。我已经将这些步骤归结为以下docker文件:

FROM ubuntu:xenial-20180112.1

VOLUME /test

COPY /test/copydir/copyfile.txt /test/copydir/copyfile.txt

RUN mkdir -p /test/mkdir && \
    touch /test/mkdir/touch.txt

请注意,当我打入正在运行的容器并执行

ls -l /test

我只收到'copydir'文件夹。但是,如果我在dockerfile中运行ls,我看到两个文件夹都存在。

这里发生了什么?

编辑:

对于其他上下文,以下打印出两个目录都存在:

FROM ubuntu:xenial-20180112.1

VOLUME /test

COPY /test/copydir/copyfile.txt /test/copydir/copyfile.txt

RUN mkdir -p /test/mkdir && \
    touch /test/mkdir/touch.txt && \
    ls -l /test

但以下只表明copydir存在:

FROM ubuntu:xenial-20180112.1

VOLUME /test

COPY /test/copydir/copyfile.txt /test/copydir/copyfile.txt

RUN mkdir -p /test/mkdir && \
    touch /test/mkdir/touch.txt

RUN ls -l /test

3 个答案:

答案 0 :(得分:1)

我没有对此的确切解释,但是当您使用Dockerfile构建图像时,它将使最轻的图像成为可能。当您使用RUN时,您不会使数据持久,但您只会执行一个不会保留在图像中的结果的操作。

请注意,apt-get和yum命令会使安装保持不变。这有点奇怪。

答案 1 :(得分:0)

尝试将Dockerfile更改为:

FROM ubuntu:xenial-20180112.1

RUN mkdir -p /test
COPY /test/copydir/copyfile.txt /test/copydir/copyfile.txt

RUN mkdir -p /test/mkdir && \
    touch /test/mkdir/touch.txt

VOLUME /test

答案 2 :(得分:0)

在你说的一句话中"为了清楚起见,我提供的例子被删减了,实际上音量是由父母图像定义的。"这会将问题与不可能取消导出图像的卷条目的情况联系起来。如果可以(例如使用docker-copyedit),那么您的问题可能会消失。 ;)