folder/file 上的所有者用户错误:docker 运行 -v <host_path_dir_file>:<docker_some_path_dir_file>/ 不适用于 Dockerfile 中定义的用户
Wrong OWNER USER on folder/file: docker run -v <host_path_dir_file>:<docker_some_path_dir_file>/ not working for user defined in Dockerfile
主机OS:红帽企业Linux服务器版本7.9(麦婆)
Guest OS 即 Docker 容器 运行ning: OpenSuse 15.2
Docker 版本(在主机上):Docker 版本 19.03.5,构建 633a0ea
在主机上,当我 git 克隆存储库“utilities_scripts”时,我对用户具有有效访问权限(由于 umask)。
- 我认为这里的问题与权限无关,但是为什么 Docker 文件中定义的 USER 没有被设置为 folders/files 的所有者(正在安装)docker 容器,当我发出以下
docker run ...
命令时。设置 755/775 等不是一个选项,因为我不能在容器内将 chown 作为目标 docker 用户并且设置 777 是不好的做法。
注意:
- 当我从不同的 Linux 机器尝试相同的 docker 图像时,folder/files 被挂载为用户 "docker_non_root_user" 在 Docker 文件中定义为
USER docker_non_root_user
.
docker build ...
运行s 成功并创建了一个图像,容器在不同的机器上工作(当我使用 -v <host>:<container>
docker CLI 选项语法。
Docker文件中的代码片段是:
# Define any mount points references
VOLUME ["/home/docker_non_root_user/git"]
USER docker_non_root_user
WORKDIR /home/docker_non_root_user/git
这是我在有 Docker 文件 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 运行 命令)正在文件夹 utilities_scripts 的 docker 容器内设置,但在 Dockerfile/exists 容器里面? (请参阅上面输出中的倒数第二行)。它目前在 docker 容器内获得相同主机的所有者和文件夹级别的权限。
gigauser
即主机的用户,不在 docker 容器中,但文件 ls -l
输出显示 gigauser
是 utilities_scripts
的所有者 folder/files 在容器中。此问题不会出现在其他主机上。
我什至检查了 /etc/subuid
文件,我觉得没问题。将里面的值更改为 docker 的用户没有帮助。此外,我在 /etc/docker/daemon.json
文件中没有看到任何与此相关的内容。
$ cat /etc/subuid
gigauser:165536:65536
运行 来自另一台 Linux 主机的相同 docker run ....options
命令,它将 docker 容器内的文件夹所有权显示为:
drwx------ 5 docker_non_root_user 1000 272 Jan 26 21:52 utilities_scripts
用户 gigauser
数字 ID 不是 1000,即 21520。它在另一台主机上工作,因为本地用户可能有数字 ID 1000。
因为我们正在挂载文件夹而不是复制它,当您挂载它时,它会共享到容器中,与 permissions/IDs 上设置的完全相同主机 - 因为它在主机上。容器不像具有完全独立资源的 VM,即使在 VM 上,如果您挂载类似 NFS 目录的内容,您将获得可能与您的本地 ID 匹配或不匹配的数字 ID。
使用 /etc/subuid 需要将标志传递给 运行 命令,并且您必须进行数学运算才能为您的用户算出偏移量。
主机OS:红帽企业Linux服务器版本7.9(麦婆)
Guest OS 即 Docker 容器 运行ning: OpenSuse 15.2
Docker 版本(在主机上):Docker 版本 19.03.5,构建 633a0ea
在主机上,当我 git 克隆存储库“utilities_scripts”时,我对用户具有有效访问权限(由于 umask)。
- 我认为这里的问题与权限无关,但是为什么 Docker 文件中定义的 USER 没有被设置为 folders/files 的所有者(正在安装)docker 容器,当我发出以下
docker run ...
命令时。设置 755/775 等不是一个选项,因为我不能在容器内将 chown 作为目标 docker 用户并且设置 777 是不好的做法。
注意:
- 当我从不同的 Linux 机器尝试相同的 docker 图像时,folder/files 被挂载为用户 "docker_non_root_user" 在 Docker 文件中定义为
USER docker_non_root_user
. docker build ...
运行s 成功并创建了一个图像,容器在不同的机器上工作(当我使用-v <host>:<container>
docker CLI 选项语法。
Docker文件中的代码片段是:
# Define any mount points references
VOLUME ["/home/docker_non_root_user/git"]
USER docker_non_root_user
WORKDIR /home/docker_non_root_user/git
这是我在有 Docker 文件 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 运行 命令)正在文件夹 utilities_scripts 的 docker 容器内设置,但在 Dockerfile/exists 容器里面? (请参阅上面输出中的倒数第二行)。它目前在 docker 容器内获得相同主机的所有者和文件夹级别的权限。
gigauser
即主机的用户,不在 docker 容器中,但文件 ls -l
输出显示 gigauser
是 utilities_scripts
的所有者 folder/files 在容器中。此问题不会出现在其他主机上。
我什至检查了 /etc/subuid
文件,我觉得没问题。将里面的值更改为 docker 的用户没有帮助。此外,我在 /etc/docker/daemon.json
文件中没有看到任何与此相关的内容。
$ cat /etc/subuid
gigauser:165536:65536
运行 来自另一台 Linux 主机的相同 docker run ....options
命令,它将 docker 容器内的文件夹所有权显示为:
drwx------ 5 docker_non_root_user 1000 272 Jan 26 21:52 utilities_scripts
用户 gigauser
数字 ID 不是 1000,即 21520。它在另一台主机上工作,因为本地用户可能有数字 ID 1000。
因为我们正在挂载文件夹而不是复制它,当您挂载它时,它会共享到容器中,与 permissions/IDs 上设置的完全相同主机 - 因为它在主机上。容器不像具有完全独立资源的 VM,即使在 VM 上,如果您挂载类似 NFS 目录的内容,您将获得可能与您的本地 ID 匹配或不匹配的数字 ID。
使用 /etc/subuid 需要将标志传递给 运行 命令,并且您必须进行数学运算才能为您的用户算出偏移量。