卷和 VOLUME:两个地方都必须存在一条路径吗?

卷和 VOLUME:两个地方都必须存在一条路径吗?

如果我要像这样运行 nginx:

docker run -i -t -p 80:80 \
-v /docker/dev:/dev \
-v /docker/var/www:/var/www \
-v /docker/var/log/nginx:/var/log/nginx \
-v /docker/etc/nginx:/etc/nginx \
--name clmnginxbash quasaur/nginximage /bin/bash

...我正在使用 Docker HOST 的文件系统来存储nginx配置和网站本身,我不应该为这些共享包含 VOLUME 语句,还是应该?

VOLUME ["/etc/nginx", "/var/www","/var/log/nginx"]

事实上,由于这些目录不会被使用,我难道不应该从 Dockerfile 中的镜像中删除它们吗?

RUN rm -rf /usr/share/nginx/www /etc/nginx /var/log/nginx

感谢您的反馈意见!

答案1

-v在指令中指定运行或卷时VOLUME,都会安装绕过 UFS 的卷来存储持久数据。请参阅https://docs.docker.com/terms/layer/#ufs-def。它是容器中的实际挂载:

$ docker run --rm ubuntu mount | grep mnt

容器中没有安装任何内容。让我们再试一次-v /mnt

$ docker run --name mount -v /mnt ubuntu mount | grep mnt
/dev/sda1 on /mnt type ext4 (rw,relatime,data=ordered)

太棒了,我们有一个持久挂载。但我们没有在主机上指定一个位置来存储它……它实际上在哪里?

$ docker inspect --format '{{ .Volumes }}' mount
map[/mnt:/mnt/sda1/var/lib/docker/vfs/dir/3d0eff68f9db4821821812f9e363c1e6058105de8a7a04ecfda113e8def9848a]

正如您已经指出的那样,您可以通过在挂载前添加一些前缀来将其映射到主机上的目录:

$ docker run --rm -v /folder/on/host:/mnt

因此,回答您的两个问题,不,中的 VOLUME 指令Dockerfile不是必需的。您应该删除它们吗?我猜,假设您永远不会在不指定的情况下在容器中保留持久数据-v

相关内容