![在多个容器之间共享主机目录与 SELinux](https://linux22.com/image/85911/%E5%9C%A8%E5%A4%9A%E4%B8%AA%E5%AE%B9%E5%99%A8%E4%B9%8B%E9%97%B4%E5%85%B1%E4%BA%AB%E4%B8%BB%E6%9C%BA%E7%9B%AE%E5%BD%95%E4%B8%8E%20SELinux.png)
与 docker 容器共享主机目录通常很简单:
$ docker create -v /path/to/hostdir:/path/inside/container --name conta ...
如果涉及 SELinux,事情会变得更加复杂 - 例如,SELinux 在执行 SELinux 的 docker 主机(也是 Fedora 23)上执行 Fedora 23 容器。
在这种情况下,显然,必须指示 docker 进行一些重新标记:
$ docker create -v /path/to/hostdir:/path/inside/container:Z --name conta ...
如果没有:Z
后缀,当尝试读取/写入共享主机目录中的文件时,您会收到权限被拒绝的错误。一切都:Z
按预期进行。
:Z
但是如果主机目录应该与以下对象共享,则该方法会失败多种的(SELinux 强制)同时容器:
$ docker create -v /path/to/hostdir:/path/inside/container:Z --name conta ...
$ docker create -v /path/to/hostdir:/path/inside/container:Z --name contb ...
在第二条命令之后,“contb”可以访问主机目录,但“conta”无法再访问它(权限被拒绝错误)。
看来 docker 的第二次重新标记使第一次无效。
如何在 SELinux 系统上修复此问题?
答案1
不确定它是否有帮助,因为我现在没有使用 docker,但我已经非常接近这些技术了。
有好文章Dan Walsh 描述了命令之间:Z
和命令:z
中的差异docker
。
TL;DR,第一个 ( :Z
) 是使用多类别安全 (MCS) 标签,这将为不同的容器制作具有不同不同类别的相同标签。
第二个 ( :z
) 将为每个容器使用相同的标签来标记目录,并且它们应该能够同时访问该路径。
如果没有帮助,请提供您从 docker 获得的 AVC。否则就像猜测一样。