Linux

文件夾/文件上的 OWNER USER 錯誤: docker run -v <host_path_dir_file>:<docker_some_path_dir_file>/ not working for user defined in …

  • February 14, 2022

主機作業系統: Red Hat Enterprise Linux Server 7.9版(Maipo)

來賓作業系統,即執行的 Docker 容器:OpenSuse 15.2

Docker 版本(在主機上):Docker 版本 19.03.5,建構 633a0ea

在主機上,當我 git 複製儲存庫“utilities_scripts”時,我對使用者具有有效訪問權限(由於 umask)。

  • docker run ...我認為這裡的問題與權限無關,但是當我發出以下命令時,為什麼 Dockerfile 中定義的 USER 沒有被設置為 docker 容器內的文件夾/文件(正在掛載)的所有者。設置 755/775 等不是一個選項,因為我不能在容器內以目標 docker 使用者的身份 chown 並且設置 777 是不好的做法。

注意

  1. 當我從不同的 Linux 機器嘗試相同的 docker 映像時,文件夾/文件作為使用者“ docker_non_root_user ”安裝,該使用者在 Dockerfile 中定義為USER docker_non_root_user.
  2. docker build ...成功執行並創建映像,並且容器在另一台機器上工作(當我使用-v &lt;host&gt;:&lt;container&gt;docker CLI 選項語法將 git clone 儲存庫安裝在容器內時。

來自 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

這是我在存在 DockerfileUSER ...所有權問題的主機上看到的:

[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.

問題:為什麼我看到主機使用者的 USER-ID(我在其中執行docker run命令)設置在 docker 容器中的 utility_scripts 文件夾中,而Dockerfile中沒有創建這樣的使用者 ID/容器內不存在此類使用者 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

我不完全確定我是否遵循您的問題,因為這對我來說有點不清楚。但是,據我了解:

您的gigauser數字 ID 不是1000,它看起來可能是21520。它可以在另一台主機上執行,因為您的本地使用者可能有數字 ID 1000

您會看到主機的使用者 ID,因為您正在安裝文件夾,而不是複制它。當您掛載它時,它會以與主機上設置的完全相同的權限/ID 共享到容器中 - 因為它在主機上。容器不像具有完全獨立資源的虛擬機,即使在虛擬機上,如果您掛載類似 NFS 目錄的東西,您將獲得可能與本地 ID 匹配或不匹配的數字 ID。

使用/etc/subuid需要將標誌傳遞給執行命令,並且您必須進行數學運算才能為使用者計算出偏移量。

引用自:https://serverfault.com/questions/1093422