文件夹/文件的 OWNER USER 错误:docker run -v:/不适用于 Dockerfile 中的用户定义

文件夹/文件的 OWNER USER 错误:docker run -v:/不适用于 Dockerfile 中的用户定义

主机操作系统:Red Hat Enterprise Linux 服务器版本7.9(迈坡)

客户操作系统即运行以下 Docker 容器:OpenSuse 15.2

Docker 版本(在主机上):Docker 版本 19.03.5,构建 633a0ea

在主机上,当我 git clone 存储库“utilities_scripts”时,我对该用户具有有效的访问权限(由于 umask)。

  • 我认为这里的问题与权限无关,而是当我发出以下命令时,为什么 Dockerfile 中定义的用户没有被设置为 Docker 容器内文件夹/文件(正在挂载)的所有者docker run ...。设置 755/775 等不是一个选项,因为我无法在容器内以目标 Docker 用户的身份进行 chown,而设置 777 是一种不好的做法。

笔记

  1. 当我从不同的Linux机器上尝试相同的docker镜像时,文件夹/文件被挂载为用户“docker_non_root_用户“其在Dockerfile中定义为USER docker_non_root_user
  2. docker build ...成功运行并创建一个图像,并且容器在不同的机器上工作(当我使用-v <host>:<container>docker CLI 选项语法在容器内挂载 git clone repos 时)。

代码片段来自 Dockerfile 的内容为:

# Define any mount points references
VOLUME ["/home/docker_non_root_user/git"]

USER docker_non_root_user
WORKDIR /home/docker_non_root_user/git

这是我在存在 Dockerfile 所有权问题的主机上看到的内容USER ...

[gigauser@jenkins-projectABC bitbucket_workspace]$ whoami
gigauser
[gigauser@jenkins-projectABC bitbucket_workspace]$ id
uid=gigauser(gigauser) gid=21520(jenkins) groups=21520(jenkins),3000(ectx)

[gigauser@jenkins-projectABC bitbucket_workspace]$ umask
0077
[gigauser@jenkins-projectABC bitbucket_workspace]$ ls -l
total 12
drwx------  5 gigauser jenkins 4096 Feb  3 16:36 utilities_scripts
[gigauser@jenkins-projectABC bitbucket_workspace]$


[gigauser@jenkins-projectABC bitbucket_workspace]$ sudo docker image ls
Active Directory Password:
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
project-im-opensuse   15.2                0c9ee31464cd        43 hours ago        2.39GB
[gigauser@jenkins-projectABC bitbucket_workspace]$

[gigauser@jenkins-projectABC bitbucket_workspace]$
[gigauser@jenkins-projectABC bitbucket_workspace]$ sudo docker run -v $PWD/utilities_scripts:/home/docker_non_root_user/git/utilities_scripts/ -it project-im-opensuse:15.2 bash -c "whoami; id; which bash; bash --version; ls -l; echo; ls -l utilities_scripts; ls -l /home/docker_non_root_user/git/utilities_scripts; id gigauser; echo"

WARNING: IPv4 forwarding is disabled. Networking will not work.


docker_non_root_user
uid=1000(docker_non_root_user) gid=487(docker_non_root_user) groups=487(docker_non_root_user),100(users)

/bin/bash
GNU bash, version 4.4.23(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
total 8
drwx------ 5 gigauser 21520 4096 Feb  4 00:36 utilities_scripts

ls: cannot open directory 'utilities_scripts': Permission denied
ls: cannot open directory '/home/docker_non_root_user/git/utilities_scripts': Permission denied
id: 'gigauser': no such user

[gigauser@jenkins-projectABC bitbucket_workspace]$

当我在其他 Linux 机器上运行相同的命令时,我看到已挂载utilities_scripts文件夹的所有者是docker_non_root_user

问题:为什么我看到了主机用户的用户 ID(我正在运行docker 运行命令)正在 docker 容器内的文件夹中设置实用程序脚本当 Dockerfile/容器内不存在这样的用户 ID 时(请参见上述输出中的倒数第二行)。它目前在 docker 容器内获取相同主机的所有者和文件夹级别权限。

gigauser即主机的用户不在 docker 容器中,但文件ls -l输出显示gigauser是容器中文件夹/文件的所有者utilities_scripts。此问题不会出现在其他主机上。

我甚至检查了/etc/subuid文件,对我来说看起来没问题。将里面的值更改为 docker 的用户没有帮助。而且我在/etc/docker/daemon.json文件中没有看到与此相关的任何内容。

$ cat /etc/subuid
gigauser:165536:65536

docker run ....options从另一台 Linux 主机运行上述相同的命令,它显示 docker 容器内的文件夹所有权如下:

drwx------ 5 docker_non_root_user 1000  272 Jan 26 21:52 utilities_scripts

答案1

我不太确定我是否理解了你的问题,因为这个问题对我来说有点不清楚。但据我所知:

您的gigauser数字 ID 不是1000,看起来可能是21520。它在另一台主机上工作,因为您的本地用户可能具有数字 ID 1000

您之所以能看到主机的用户 ID,是因为您正在挂载文件夹,而不是复制它。挂载文件夹时,它会被共享到容器中,并且具有与主机上设置的完全相同的权限/ID - 因为它位于主机上。容器不像具有完全独立资源的虚拟机,即使在虚拟机上挂载 NFS 目录之类的东西,您也会获得可能与您的本地 ID 匹配也可能不匹配的数字 ID。

使用/etc/subuid需要将标志传递给运行命令,并且您必须进行数学运算来计算用户的偏移量。

相关内容