Dockerfile VOLUME 指令清除数据

科斯

作为更大设置的一部分,我使用 Docker Compose 构建了一个多阶段 Docker 构建,其中包含一个builder包含/var/www. 当我构建名为application我的 Dockerfile的第二阶段容器时,有这些说明

ARG APPLICATION_BUILDER

FROM $APPLICATION_BUILDER as builder

FROM busybox

COPY --from=builder --chown=www-data:www-data /var/www /var/www

VOLUME /var/www

ENTRYPOINT ["tail"]
CMD ["-f", "/dev/null"]

builderDockerfile是:

FROM ubuntu:16.04

ARG APPLICATION_SOURCE_FOLDER

COPY --chown=www-data:www-data ${APPLICATION_SOURCE_FOLDER} /var/www

当我启动builder容器时,它/var/www按预期包含了所有数据但是,当我application使用以下方法启动容器时:docker run -it <IMAGE>它不包含任何内容/var/www

如果我删除该VOLUME /var/www行,Dockerfile则数据会按预期显示。但是我不明白为什么该VOLUME指令会使数据消失,我认为这是将内容导出/var/www/为卷?

除了指令之外,-v我还需要指定何时执行吗?docker runVOLUME

拉尔斯克

VOLUME指令不会“导出目录的内容”。它说“创建一个卷并将其安装在此路径上”。所以当你写:

COPY --from=builder --chown=www-data:www-data /var/www /var/www
VOLUME /var/www

你是说:

  • 首先,复制一堆文件到 /var/www
  • 接下来,挂载一个空卷 /var/www

卷挂载发生在构建时(影响任何后续RUN语句)和运行时(影响您看到的环境docker run)。

如果您VOLUME从您指令中删除指令Dockerfile,然后像这样运行您的图像:

docker run -v /var/www yourimage ...

然后 Docker 将创建一个新卷并将其内容复制/var/www到其中,然后再安装它。

同样,如果你有一个命名卷,你可以做同样的事情:

docker run -v myvolume:/var/www yourimage ...

如果您正在挂载的卷为空,Docker 只会执行此自动复制操作。如果该卷有现有内容,它将简单地安装在指定的路径上,隐藏该安装点下的任何内容。


例如...

我有一个名为的图像kos,其中包含一些/var/www. 我们可以通过运行来查看它们ls /var/www

bash-5.0$ docker run kos ls /var/www
index.html
testing.jpg

如果我在安装一个匿名的体积/var/wwwdocker run -v中,我们可以看到,它就会从底层的内容填充/var/www目录:

bash-5.0$ docker run -v /var/www kos ls /var/www
index.html
testing.jpg

如果我们创建一个命名卷并将其安装在 上,我们会看到相同的行为/var/www

bash-5.0$ docker volume create kos_testing
kos_testing
bash-5.0$ docker run -v kos_testing:/var/www kos ls /var/www
index.html
testing.jpg
bash-5.0$

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章