作为更大设置的一部分,我使用 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"]
该builder
Dockerfile是:
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 run
VOLUME
该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/www
与docker 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] 删除。
我来说两句