在多个容器与 SELinux 之间共享主机目录

max*_*zig 5 fedora selinux docker

与 docker 容器共享主机目录通常很容易:

$ docker create -v /path/to/hostdir:/path/inside/container --name conta ...
Run Code Online (Sandbox Code Playgroud)

如果涉及到 SELinux,事情会变得更加复杂——例如,在 SELinux 强制 docker 主机(也是 Fedora 23)上的 SELinux 强制 Fedora 23 容器。

在这种情况下,显然,必须指示 docker 进行一些重新标记:

$ docker create -v /path/to/hostdir:/path/inside/container:Z --name conta ...
Run Code Online (Sandbox Code Playgroud)

如果没有: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 ...
Run Code Online (Sandbox Code Playgroud)

在第二个命令之后,'contb' 可以访问主机目录,但 'conta' 不能再访问它(权限被拒绝错误)。

似乎 docker 的第二次重新标记使第一次无效。

如何在 SELinux 系统上解决这个问题?

Jak*_*uje 3

不确定它是否有帮助,因为我现在没有使用 docker,但我已经非常接近这些技术了。

Dan Walsh有一篇很好的文章:Z描述了命令之间和命令:z中的差异docker

TL;DR,第一个 ( :Z) 是使用多类别安全 (MCS) 标签,这将为不同的容器制作具有不同不同类别的相同标签。

第二个 ( :z) 将为每个容器使用相同的标签来标记目录,并且它们应该能够同时访问该路径。

如果没有帮助,请提供您从 docker 获得的 AVC。否则就像猜测一样。