3

我有两个容器,在其中一个容器中,我使用 gluster 文件系统将需要的文件挂载到容器的 mnt 目录中,并在 Dockerfile 中使用VOLUME /mnt 来共享卷。我用这个运行这个容器:

docker run -d --cap-add SYS_ADMIN --device=/dev/fuse:/dev/fuse -e MOUNTPOINT="server1:test" -e TARGET="/mnt"  --name gluster gluster-client

我想在作为 nginx 容器的第二个容器中使用这些文件,所以我使用 --volumes-from 运行该容器以使用该共享卷,这就是我运行容器的方式:

docker run -it --volumes-from gluster  nginx sh

我的 gluster 容器工作正常,我的意思是我检查了挂载目录(这里 /mnt),我可以看到文件,但是在我使用的第二个容器中,我使用 docker --volumes-from 在 /mnt 目录中没有文件,似乎它可以挂载目录但不能挂载这些目录中的文件,我该如何修复它?是因为我使用的是 gluster 还是什么?

gluster 容器基于 fedora,nginx 容器基于 alpine。

我感谢您的帮助:)

4

1 回答 1

2

这可能是由于 SELinux。尝试运行第二个容器

docker run -it --volumes-from gluster:z  nginx sh

docker run 参考文档

像 SELinux 这样的标签系统要求在安装到容器中的卷内容上放置适当的标签。如果没有标签,安全系统可能会阻止在容器内运行的进程使用内容。默认情况下,Docker 不会更改操作系统设置的标签。

要更改容器上下文中的标签,您可以将两个后缀 :z 或 :Z 添加到卷挂载中。这些后缀告诉 Docker 重新标记共享卷上的文件对象。z 选项告诉 Docker 两个容器共享卷内容。因此,Docker 使用共享内容标签来标记内容。共享卷标允许所有容器读/写内容。Z 选项告诉 Docker 使用私有非共享标签标记内容。只有当前容器可以使用私有卷。

关于相同的论点,您可以找到更多关于Using Volumes with Docker can Cause Problems with SELinuxPractical SELinux and Containers的详细信息。

编辑:如果这不是原因,您的问题应该是由于 glusterfs 和数据容器。尝试使用命名卷。

VOLUME将第一个容器中的行更改为

VOLUME myVolume:/mnt

在第二个容器中--volumes-from,您可以使用. 而不是--volume=myVolume.

在Docker Data Containers and Named VolumesDocker named volume上查看有关数据容器和命名卷的更多信息。

于 2017-01-21T00:29:14.320 回答