Docker 挂载参数中 z 共享标签的含义
z 这个「共享标签」是 SELinux 给文件 / 目录打标签时的一种规则,核心是解决多容器共享目录的权限问题。
一、先搞懂 SELinux 标签的基础
在开启 SELinux 的 Linux 系统(比如 CentOS、RHEL)中,每个文件 / 目录都有一个「安全标签」,格式大概是:
system_u:object_r:xxx_t:s0
其中 xxx_t 是关键的类型标签:
宿主机普通文件的标签可能是 default_t
Docker 容器内文件的标签是 container_file_t
SELinux 会根据这个标签判断「谁能访问这个文件」,默认情况下,宿主机的文件标签不是 container_file_t,容器就没有权限读写,这就是很多人挂载目录后容器提示权限拒绝的原因。
二、「共享标签(z)」的具体作用
z 本质是告诉 SELinux:给这个挂载目录打上「可被多个容器共享访问」的 SELinux 标签。
拆解说明
不加 z:挂载的目录标签还是宿主机的 default_t,SELinux 会阻止容器访问;
加了 z:Docker 会自动把宿主机 /opt/gitlab/config 目录的 SELinux 标签修改为 container_file_t,并且标记为「共享」—— 不仅当前 GitLab 容器能访问,再启动其他容器挂载这个目录也能正常访问;
补充:如果用 Z(大写),则是「私有标签」—— 目录的 SELinux 标签只会分配给当前这一个容器,其他容器就算挂载也访问不了。
三、直观对比表
命令 SELinux 标签变化 多容器共享 权限结果
-v /opt/gitlab/config:/etc/gitlab 保持 default_t ❌ 容器权限拒绝
-v /opt/gitlab/config:/etc/gitlab:z 改为 container_file_t(共享) ✅ 所有挂载该目录的容器都能访问
-v /opt/gitlab/config:/etc/gitlab:Z 改为 container_file_t(私有) ❌ 只有当前容器能访问
四、总结
「共享标签(z)」是 SELinux 层面的权限标记,核心是让挂载目录被多个容器共享访问;
z(小写)= 共享,Z(大写)= 私有,二者都是为了让容器获得目录的 SELinux 访问权限;
只有在开启 SELinux 的 Linux 系统上需要加 z/Z,如果是 Ubuntu(默认关闭 SELinux)等系统,加不加 z 都不影响。

浙公网安备 33010602011771号