VMware工作站:16.2.5/17.0.2
Ubuntu:20.04.6/22.04.3
Dockerfile:
FROM debian:12.1-slim
WORKDIR /root
RUN groupadd -f ernie-1001 -g 1001 \
&& groupadd -f ernie-1000 -g 1000 \
&& useradd -ms /bin/bash ernie -g 1001 -G 1000 \
&& printf "ernie:ernie" | chpasswd \
&& adduser ernie sudo \
&& printf "ernie ALL= NOPASSWD: ALL\\n" >> /etc/sudoers
在全新的 Ubuntu 22.04.3 安装上,我们运行以下命令序列并期望得到以下输出:
$ sudo apt install docker-compose
$ sudo docker build . -t strange:1.0
$ sudo docker run -it --name strangebase strange:1.0
root@d031fe5152e4:~# su ernie
ernie@d031fe5152e4:/root$ cd
ernie@d031fe5152e4:~$ ls -all
total 20
drwxr-xr-x 2 ernie ernie-1001 4096 Aug 19 04:16 .
drwxr-xr-x 1 root root 4096 Aug 19 04:16 ..
-rw-r--r-- 1 ernie ernie-1001 220 Apr 23 21:23 .bash_logout
-rw-r--r-- 1 ernie ernie-1001 3526 Apr 23 21:23 .bashrc
-rw-r--r-- 1 ernie ernie-1001 807 Apr 23 21:23 .profile
ernie@d031fe5152e4:~$
我们得到的是:
$ sudo apt install docker-compose
$ sudo docker build . -t strange:1.0
$ sudo docker run -it --name strangebase strange:1.0
root@d031fe5152e4:~# su ernie
ernie@d031fe5152e4:/root$ cd
ernie@d031fe5152e4:~$ ls -all
total 20
drwxr-xr-x 2 root root 4096 Aug 19 04:16 .
drwxr-xr-x 1 root root 4096 Aug 19 04:16 ..
-rw-r--r-- 1 root root 220 Apr 23 21:23 .bash_logout
-rw-r--r-- 1 root root 3526 Apr 23 21:23 .bashrc
-rw-r--r-- 1 root root 807 Apr 23 21:23 .profile
ernie@d031fe5152e4:~$
由于某种原因, ernie 主目录(即 /home/ernie)仍然由 ernie 所有root
,但情况不应该是这样,不是吗?
我在几台机器上尝试过,结果相同。奇怪的是,之前安装的 ubuntu_22.04 VM 按预期工作。
我还尝试将其放入RUN chown -R ernie:ernie /home/ernie
Dockerfile 中以进行良好的测量,但无济于事。
我在这里做错了什么吗?最近有人经历过类似的事情吗?
谢谢。
答案1
似乎存在一个特定的错误,即由 docker export 命令创建的 tar 存档缺少所有权信息(所有文件均归 root 所有)。如果此存档随后用于为非特权进程重新创建文件系统(例如通过 docker import 或只是将其解压并 chroot),则它们可能会因权限被拒绝错误或以其他方式失败。
当使用 1.19 之前版本的 Go 构建包时,会发生此错误:此版本的 Go 引入了一个 unix 构建标签,上游使用该标签来确定是否应将 UNIX 特定属性添加到存档中。较旧的 Go 版本默默地忽略此源代码,结果是 tar 存档中缺少 UID 和 GID。
https://bugs.launchpad.net/ubuntu/+source/docker.io-app/+bug/2029523。