Docker 主机挂载卷权限

zap*_*aps 5 linux docker docker-volume docker-engine

在我们的内部测试环境中,我们从基于 vSphere 的服务器配置 CentOS VM。这些图像是 vanilla 7.1,带有软件包和相关配置,以支持通过 LDAP 进行身份验证。我在 xfs 文件系统上安装了 Docker 1.13.1 和 OverlayFS 驱动程序。

FROM centos:7
RUN useradd dockeruser
USER dockeruser
VOLUME /data
Run Code Online (Sandbox Code Playgroud)

在主机上:

mkdir data
echo "hello from host" > data/host-msg.txt
docker run -ti --rm -v $(pwd)/data:/data testimage bash
Run Code Online (Sandbox Code Playgroud)

容器内部:

echo "hello from container" > /data/container-msg.txt
bash: /data/container-msg.txt: Permission denied
Run Code Online (Sandbox Code Playgroud)

列出容器内的目录内容:

drwxr-xr-x   2 12345 13000    25 Feb 12 21:36 data
drwxr-xr-x   5 root  root    360 Feb 12 21:36 dev
drwxr-xr-x   1 root  root     62 Feb 12 21:36 etc
Run Code Online (Sandbox Code Playgroud)

data目录以 uid/gid 格式显示所有权,而不是用户名/组名。

我读过许多描述这种行为的文章和问题以及各种 解决方法

。在我本地的 Fedora 25 开发系统上,我没有遇到这种情况。我执行上述过程,能够写入主机安装的/数据安装,并且目录列表显示用户名/组名。

/
    drwxrwxr-x   2 dockeruser dockeruser  4096 Feb 12 04:36 data
    drwxr-xr-x   5 root       root         360 Feb 12 22:00 dev
    drwxr-xr-x   1 root       root        4096 Feb 12 22:00 etc

/data
    -rw-rw-r--   1 dockeruser dockeruser    21 Feb 12 22:04 container-msg.txt
Run Code Online (Sandbox Code Playgroud)

为了使一切尽可能与实验室配置相似,我通过 libvirt 在我的开发系统上建立了一个 CentOS 7.1 虚拟机,并再次得到了相同的结果——没有弄乱 uid/gid 映射、用户命名空间,什么都没有。从“Just Worked”容器内部写入主机安装的卷,开箱即用。

什么可能解释这种行为?实验室虚拟机上的 LDAP 是否以某种方式在文件系统级别引入了权限问题?我可以要求我们的运营团队检查或暂时禁用某些具体内容来尝试解决此问题吗?

最后,也许也是最重要的一点是,如果主机安装卷上的权限问题对我来说在干净的 CentOS 或 Fedora 工作站上根本不是问题,那么为什么它仍然是 Docker 社区中的一个问题呢?这些设置中是否有一些配置与其他人正在使用的配置(包括我团队的实验室虚拟机)有根本不同,以至于一切正常?

gbo*_*olo 0

数据目录以 uid/gid 格式显示所有权,而不是用户名/组名。

这是因为您的容器没有此 uid/guid 的映射(检查 /etc/passwd)。事实上,实际文件始终具有 uid/guid 。这只是应用程序/操作系统返回名称的功能。尝试stat从容器内部/外部的路径。他们应该有相同的 uid/guid

stat /data
stat /path/on/host
Run Code Online (Sandbox Code Playgroud)