我一直在经历一些关于音量的奇怪行为。我们有一个包含数据库的容器,并且预计会从包含数据的主机绑定(bind)挂载文件夹。我正在尝试创建一个附带测试数据的子容器,因为它仅用于测试。
这要求在构建步骤中,从主机复制一些数据,然后运行一些创建附加文件的脚本。然而,我注意到,当我查看正在运行的容器时,只存在复制的文件,而脚本创建的文件不存在。我已经将步骤归结为以下 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
请注意,当我 bash 进入正在运行的容器并执行
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
最佳答案
我对此没有确切的解释,但是当您使用 Dockerfile 构建镜像时,它将使最轻的镜像成为可能。当您使用 RUN 时,您不会使数据持久化,但您只会执行一个操作,该操作会给出不会保留在图像中的结果。
请注意,apt-get 和 yum 命令使安装持续存在。这有点奇怪。
关于Dockerfile 可以 COPY 文件到声明的卷中,但是 RUN 不能创建文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50000216/