docker - 容器内的用户和组存在问题

标签 docker uid

初步
首先是初步的。当运行具有映射到主机某个部分的卷的Docker容器时,Docker容器内的用户通常是root用户,因此对于由该容器生成的文件,主机无法编辑,修改或删除它们。为了解决这个问题,有些人(包括创建我正在使用的图像的人)建议使用-u 情况
我有一个Docker镜像(由其他人在其他计算机上构建)
该Docker镜像假定用户将是ID为1000的用户
问题
当主机主机的唯一用户(用户ID为1000)运行该镜像时,就没有问题。但是,就我而言,我是该主机的第二个用户,因此我的用户ID为1001。因此,我具有以下内容:
在主机中,我执行cat /etc/passwd,并获得了多个用户,包括:

firstuser:x:1000:1000:firstluser,,,:/home/firstuser:/bin/bash

myself:x:1001:1001:My Name,,,:/home/myself:/bin/bash
然后 :
案例1 我使用以下命令运行容器
docker run -it --rm -u 1001:1001  -v /a/path:/another/path image  /bin/bash
因为执行id -uid -g会给我1001。(我毕竟是第二个用户)
这样做会导致
groups:cannot find name for group ID 1001
然后我的用户变为"I have no name!",当我执行cat/etc/passwd时,我得到了originaluser:x:1000:1000::/home/originaluser:bin/bash <----这里没有,,,
因此显然我的用户(1001)不存在,这会导致很多问题。
为了解决这个问题,我尝试了
CASE2 我使用以下命令运行容器
docker run -it --rm -u 1000:1000  -v /a/path:/another/path image  /bin/bash
这不会导致先前的错误,现在即使我是myself,但将Docker镜像作为firstuser运行,在容器中我是originaluser(因为两者均为1000)
做我可以看到的cat /etc/passwd
originaluser:x:1000:1000::/home/sensetime:bin/bash
如我所料,我的用户是originaluser
我应该很高兴,但这也会引起问题!
稍后在容器内的程序上尝试创建文件(用户1000),但由于已映射文件且用户所有者为1001,因此创建失败。
什么是防止所有这些问题并能够使主机中的用户与容器中的用户同步的好方法?

最佳答案

我最近发现fixuid可能可以解决您的大多数问题。
容器中的uid / gid无法(或不应与主机上的uid / gid匹配)。
我上面链接的fixuid setuid go二进制文件可以通过在docker中更改用户的uid / gid以匹配您配置的uid / gid来解决此问题。
例如:
主机:uid / gid / name = 1001/1001 / kansai
guest 用户:uid / gid / name = 1000/1000 / user
如果您在容器中添加了fixuid二进制文件(构建阶段),则可以运行:

docker run --rm -it -u $(id -u):$(id -g) -v /a/path:/another/path image fixuid /bin/bash
您还可以在入口点设置fixuid,以便于使用。

关于docker - 容器内的用户和组存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64311753/

相关文章:

php - 使用 PHP 和 MYSQL 生成唯一 ID

java - 有没有办法使用java在Linux机器上获取用户的UID?

uuid - 覆盖 DICOM 中的像素数据时应替换哪些 DICOM UID?

docker - 使用 Ansible docker_image 构建 Docker

Dockerfile:在/tmp 上运行 ssh-agent 时,构建期间权限被拒绝

docker - 如何从主机访问docker容器中的目录?

docker - 使用虚拟方法在Docker上构建镜像并运行自己的代码

docker - kubeadm初始化问题-无法执行 'docker info'

python - 使用 RPi2 在 Python 中使用 RC522 和 USB SERIAL 读取标签 UID