我有两个容器,其中一个我使用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容器工作正常,我的意思是我检查了mount目录(这里是/ mnt),我可以看到文件,但是在第二个容器中我是usig docker --volumes-从那里没有/ mnt目录中的文件,它似乎可以挂载目录但不能挂载这些目录中的文件,我该如何修复它?是因为我使用的是gluster还是什么?
gluster容器基于fedora,而nginx容器则基于alpine。
感谢您的帮助:)。
答案 0 :(得分:1)
这可能是由于SELinux。尝试将第二个容器作为
运行docker run -it --volumes-from gluster:z nginx sh
来自docker run reference documentation:
像SELinux这样的贴标系统需要放置适当的标签 卷内容安装到容器中。没有标签,安全性 系统可能会阻止进程在容器内运行 使用内容。默认情况下,Docker不会更改标签集 通过操作系统。
要更改容器上下文中的标签,您可以添加其中任何一个 两个后缀:z或:Z到音量安装。这些后缀告诉Docker 重新标记共享卷上的文件对象。 z选项告诉我 两个容器共享卷内容的Docker。结果是, Docker使用共享内容标签标记内容。共享卷 标签允许所有容器读/写内容。 Z选项告诉我 Docker使用私有非共享标签标记内容。只有 当前容器可以使用私有卷。
关于相同的参数,您可以在Using Volumes with Docker can Cause Problems with SELinux和Practical SELinux and Containers找到更多详细信息。
编辑: 如果这不是原因,那么你的问题应该归功于glusterfs和数据容器。尝试使用命名卷。
将第一个容器中的VOLUME
行更改为
VOLUME myVolume:/mnt
在第二个容器中,您可以使用--volumes-from
代替--volume=myVolume
。
在Docker Data Containers and Named Volumes和Docker named volume explained上查看有关数据容器和命名卷的详情。