我正试图理解docker上出现的一些奇怪行为。我想要运行一个容器,将缓存数据写入来自主机的挂载卷中,以便稍后重用该容器的未来执行,并且可以从主机读取。在主机上,我看到我的用户具有用户ID
在容器中,如果我检查目录,会发现它当前由
1000
:# This is on the host
$ id
uid=1000(juan-munoz) gid=1000(juan-munoz) groups=1000(juan-munoz)...
我正在运行容器,没有为用户设置任何特殊标志,因此它以root
身份运行:
# This is on the container
$ id
uid=0(root) gid=0(root) groups=0(root)
此外,已经存在一个id=1000
的用户:
# The image is provided by AWS and apparently it includes a user with this ID
$ id -nu 1000
ec2-user
我使用-v /some/local/directory:/var/mounted
挂载了一个目录。在本地,这个目录是由我的用户(id=1000
)拥有的:
# On the host
ls -ld /some/local/directory
drwx------ 2 juan-munoz juan-munoz 4.0K Jun 21 16:21 /some/local/directory
在容器中,如果我检查目录,会发现它当前由
root
所有。这是我不理解的第一部分。# ls -ld /var/mounted
drwx------ 2 root root 4096 Jun 22 03:36 /var/mounted
为什么是root
?我原本期望使用mount
时能够尊重用户ID。
如果我试图将用户更改为1000
,会出现以下情况:
# Inside the container
$ chown -R 1000:1000 /var/mounted
ls -ld /var/mounted
drwx------ 2 ec2-user 1000 4096 Jun 22 03:36 /var/mounted
这个对我看起来很好,但是当我这么做时,如果我查看 host
上发生的情况,我会看到以下内容:
# On the host
ls -ld /some/local/directory
drwx------ 2 100999 100999 4.0K Jun 21 20:36 /some/local/directory
主机或容器的所有者出了问题。如果我在主机上运行chown 1000:1000
,容器将其视为root
,如果我在容器上运行chown 1000:1000
,主机将其视为100999
。
我做错了什么?
复现步骤
$ mkdir $HOME/testing
$ docker run -it --name=ubuntu-test --entrypoint="/bin/bash" --rm -v $HOME/testing:$HOME/testing ubuntu:latest
# Inside the container
$ cd /home/myusername/testing
$ touch file.txt
root@b98b7a5445e3:/home/juan-munoz/testing# ls -l
total 0
-rw-r--r-- 1 root root 0 Jun 30 23:52 file.txt
# Outside the container
$ ls -l $HOME/testing
total 0
-rw-r--r-- 1 juan-munoz juan-munoz 0 Jun 30 16:52 file.txt
观察到的行为:
- 在某些计算机上,从容器外部访问文件时,该文件的所有者是本地用户。而在另一些计算机上,该文件的所有者是 root。
期望的行为:
- 在不同计算机上表现一致。
/etc/docker/daemon.json
里面有什么?容器进程的cat /proc/.../uid_map
是否显示除了0 0 4294967295
之外的任何内容? - bgfvdu3w