关于 docker remap 后登陆用户无法修改原目录内容的问题 @ 三十的南瓜饭 | 2023-07-08T13:43:40+08:00 | 3 分钟阅读 | 更新于 2023-07-08T13:43:40+08:00

这里和docker remap有关。设置了remap之后,可能有的容器原有用户会映射到nobodynogroup,比如nodejs(对没错,也是折腾 hexo 的时候发现的。

这里先介绍问题以及解决问题,至于怎么开启 Docker 的 namespace 等之后整理好了再发出来。

情况复现

这里演示一下大概的情况: 先正常创建一个docker容器,让容器内应用使用 1000:1000的用户运行:

▶ docker run -it --name node-test -u 1000:1000 -v /opt/docker/hexo/www/blog:/var/www/blog -d node:latest           
bb9efcb959749b0e0c6dd5c9ec737595604b47d302294f77ed010a18a7e147a7

查看容器内内容:

# 先进入容器,查看 passwd 中的情况
▶ docker exec -it -u root node-test bash 
root@bb9efcb95974:/# grep node /etc/passwd
node❌1000:1000::/home/node:/bin/bash
root@bb9efcb95974:/# grep nobody /etc/passwd
nobody❌65534:65534:nobody:/nonexistent:/usr/sbin/nologin

# 查看 /home 目录权限
root@bb9efcb95974:/# ls -la /home
total 12
drwxr-xr-x 1 root   root    4096 Jul  4 17:28 .
drwxr-xr-x 1 root   root    4096 Jul  5 12:15 ..
drwxr-xr-x 2 nobody nogroup 4096 Jul  4 17:28 node

# 使用 root 在外部映射文件夹中创建内容
root@bb9efcb95974:/# echo "hello" > /var/www/blog/hello.txt

# 切换到 node,也创建一样的内容
root@bb9efcb95974:/# su node
node@bb9efcb95974:/$ echo "hello" > /var/www/blog/hello-node.txt

# 查看 blog 目录下的内容及权限
node@bb9efcb95974:/$ ls -la /var/www/blog/
total 24
drwxrwxrwx 3 node node 4096 Jul  5 12:20 .
drwxr-xr-x 3 root root 4096 Jul  5 12:15 ..
drwxr-xr-x 2 node node 4096 Jul  5 05:46 .github
-rw-r--r-- 1 node node   82 Jul  5 05:46 .gitignore
-rw-r--r-- 1 node node    6 Jul  5 12:20 hello-node.txt
-rw-r--r-- 1 root root    6 Jul  5 12:20 hello.txt

# 尝试使用 root 删除该目录无效
root@bb9efcb95974:/home# rm -rf ./node/
rm: cannot remove './node/.profile': Permission denied
rm: cannot remove './node/.bash_logout': Permission denied
rm: cannot remove './node/.bashrc': Permission denied

退出容器之后查看宿主机中对应目录的内容:

▶ la /opt/docker/hexo/www/blog 
total 16K
drwxr-xr-x 2 admin  admin  4.0K Jul  5 13:46 .github
-rw-r--r-- 1 admin  admin    82 Jul  5 13:46 .gitignore
-rw-r--r-- 1 admin  admin     6 Jul  5 20:20 hello-node.txt
-rw-r--r-- 1 427680 427680    6 Jul  5 20:20 hello.txt
        
▶ id admin
uid=1000(admin) gid=1000(admin) groups=1000(admin)

通过上述操作,可以知道:

  • 宿主机中 uid 为 1000 的用户(这里是admin)确实映射到了容器中(node
  • 权限配置正确,除其 node 外,其他用户权限均被映射到了427680+
  • /home/node目录权限错误,原属于 node 的目录被映射到了 nobody
  • 通过容器内的 root 用户甚至无法删除该目录
# 使用 host 创建一个
▶ docker run -it --name node-test2 --userns=host -u 1000:1000 -v /opt/docker/hexo/www/blog:/var/www/blog -d node:latest  
fdf986e76bd32bdfb85eb7a15d59cec030a9e25fe440011ec5143391b020a0d4
                                               
▶ docker exec -it -u root node-test2 bash 
root@fdf986e76bd3:/# ls -la /home
total 12
drwxr-xr-x 1 427680 427680 4096 Jul  4 17:28 .
drwxr-xr-x 1 427680 427680 4096 Jul  5 12:43 ..
drwxr-xr-x 2 428680 428680 4096 Jul  4 17:28 node

从这里就可以看到,限制之后,原本的 /home/node 目录其实是映射到了428680上,即 root+1000。root 为 427680,+1000就映射成了428680。

问题解决

这时候就靠宿主机来解决了,解决方法主要是将需要修改的目录拷贝出来,修改权限之后再复制回去。这是目前找到的最简单的方法,docker有没有直接从宿主机修改容器内容的方法还不清楚。

先使用docker cp将目录拷贝出来:

docker cp hexo_node:/home/node .

使用宿主机中的 root 用户修改属主:

chown -R 1000:1000 ./node/

最后将修改后的目录复制回去:

docker cp ./node/ hexo_node:/home/node

完成之后在容器中确认一下:

root@fdf986e76bd3:/# ls -la /home/node/  
total 28
drwxr-xr-x 1 node node 4096 Jul  5 12:12 .
drwxr-xr-x 1 root root 4096 Jul  4 17:28 ..
-rw------- 1 node node   24 Jul  5 12:12 .bash_history
-rw-r--r-- 1 node node  220 Apr 23 21:23 .bash_logout
-rw-r--r-- 1 node node 3526 Apr 23 21:23 .bashrc
-rw-r--r-- 1 node node  807 Apr 23 21:23 .profile

这样就修改完成了。


作者: 三十的南瓜饭

文章链接: https://pumpkinrice.gitlab.io/posts/4ab1a68d4f1bd1e37cab70e1c9661aee/

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 三十的南瓜饭 。

💬 评论

© 2023 南瓜饭的博客

Powered by Hugo with theme Dream.

误入迷途而知路之难返

avatar
Me

你好,我是南瓜饭,喜欢的东西很多。

一个不喜欢和人讲道理的理工宅男。

不过不是不讲道理。。。。