Dockerfile和docker-compose VOLUME的区别

68

本实验试图使用此 Docker 文件构建容器:

FROM lambdalinux/baseimage-amzn:2016.09-000
COPY ./bundle /opt/bundle/
VOLUME /bundle

在容器内部创建一个/opt/bundle/file.txt文件并写入一些文本,但是我期望的是在读完Should I include my code with COPY/ADD or a volume最后一段后,该文件会出现在主机上的bundle目录中,但实际上并没有出现。

有些情况下您可能同时想要使用COPY和volume。您可以使用COPY将代码包含在镜像中,并在开发过程中使用Compose文件中的volume将代码从主机包含进来。Volume将覆盖镜像的目录内容。

Dockerfile VOLUME和docker-compose.ymlVOLUME不是做同样的事吗?如果是这样,如何才能使主机目录中的更改在此情况下反映到容器目录中?

我还在主机上创建了一个文件bundle/play.txt,但它没有出现在/opt/bundle/...的容器中。

1个回答

86
在dockerfile中,VOLUME指令用于创建一个挂载点,但最初只会将其映射到Docker的内部数据目录。
要将卷映射到主机文件系统,需要指定主机上哪个路径应与该卷映射。可使用docker-compose文件中的volumes参数来实现此操作。(注意: 可以在docker-compose中创建卷而不在Dockerfile中声明它们)
请注意,在将主机目录映射到容器时,主机上的目录内容将替换容器中的内容,而不是反过来。

5
当我只使用compose.yml卷定义时,我可以安全地省略dockerfile卷声明吗? - velop
20
可以的,事实上在某些情况下这样做可能更好,可以参考这篇文章:https://boxboat.com/2017/01/23/volumes-and-dockerfiles-dont-mix/。 - augurar
15
为什么首先要在 Dockerfile 中声明卷呢? - Gherman
8
Dockerfile 先于 docker-compose.yml 存在,可以独立使用而不依赖于 docker-compose。 - Mark Stosberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接