![Dockerfile 中的 VOLUME 指令是否创建卷或仅指定挂载点?](https://linux22.com/image/794048/Dockerfile%20%E4%B8%AD%E7%9A%84%20VOLUME%20%E6%8C%87%E4%BB%A4%E6%98%AF%E5%90%A6%E5%88%9B%E5%BB%BA%E5%8D%B7%E6%88%96%E4%BB%85%E6%8C%87%E5%AE%9A%E6%8C%82%E8%BD%BD%E7%82%B9%EF%BC%9F.png)
https://docs.docker.com/reference/dockerfile/#volume需要努力。
“VOLUME 指令创建具有指定名称的挂载点,并将其标记为保存来自本机主机或其他容器的外部挂载卷。”
当你有
VOLUME ["/etc/blue", "/var/cache/blah", "/var/lib/bar", "/var/log"]
在你的 Dockerfile 中。我们知道我们可以使用‘docker 卷创建 foo’但没有迹象表明这是否是预期的结果。
答案1
指令VOLUME
:
在构建时创建一个匿名卷,这样放入卷挂载点的任何文件都不会包含在生成的映像中。构建完成后,将删除此卷。
在运行时创建一个匿名卷,该卷将在容器被删除时被删除,除非某些东西(卷或者绑定挂载)明确地挂载在该挂载点上。
例如,如果我们有:
FROM docker.io/alpine:latest
VOLUME /data
COPY <<EOF /data/testfile.txt
This is a test
EOF
然后:
我们会发现图像中不包含
/data/testfile.txt
。如果我们启动一个没有明确挂载的容器,如下所示:
docker run -it --rm testimage
当容器运行时我们将看到:
$ docker volume ls DRIVER VOLUME NAME local 952012ac54d9b9f7091f756940b4a5a60fa276e8fbce7a8892fc316272421613
但当容器存在时,卷将被删除。
如果我们在卷挂载点上明确挂载一个卷:
docker run -it --rm -v myvolume:/data testimage
然后就不会创建匿名卷:
$ docker volume ls DRIVER VOLUME NAME local myvolume
并且当容器退出时体积会被保留。