我一直在关注卷的一些奇怪的行为。我们有一个包含数据库的容器,并且应该从包含数据的主机绑定装入文件夹。我正在尝试创建一个带有测试数据的子容器,因为它仅用于测试。
这要求在构建步骤中,从主机复制一些数据,然后运行一些创建其他文件的脚本。我注意到,但是当我查看正在运行的容器时,只存在复制的文件,而脚本创建的文件则不存在。我已经将这些步骤归结为以下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
答案 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),那么您的问题可能会消失。 ;)