![Docker 用户命名空间和 sudo](https://linux22.com/image/705274/Docker%20%E7%94%A8%E6%88%B7%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E5%92%8C%20sudo.png)
我正在尝试使用用户命名空间功能和 来让 Docker 容器工作sudo
。如果我创建容器时将-u
标志设置为随机 UID,则sudo
不起作用,并且您会收到以下消息:
sudo: unknown uid 1234: who are you?
用户显然不在 中/etc/passwd
,这给 造成了问题sudo
。我试图让此图像与 OpenShift 的默认设置一起工作,即生成一个随机 UID,它是根组 (0) 的一部分,但我稍后需要以固定用户身份运行命令,因此想要使用 来sudo
执行此操作(并严格控制可以运行哪些命令)。如果我将一个条目附加到 中,它似乎确实有效/etc/passwd
,但这看起来很丑陋,因为它需要在每次容器启动时运行(因为它/etc/passwd
不在卷中)。
还有其他建议吗?
编辑:请注意,OpenShift 生成一个不同的每次运行容器时都会生成随机 UID。
答案1
抱歉,我不熟悉 OpenShift,但在原始 Docker 环境中,我建议您基于经过修改的容器创建一个新映像,该容器具有您想要的更改,然后从该映像运行所有新容器。您可以非常轻松地基于当前使用的映像创建另一个映像,该映像具有您修改后的 /etc/passwd 以及您想要实施的任何其他严格控制。
例如(我使用 ubuntu:latest,因为您没有提到要从中运行的实际映像)。首先,根据所选映像运行一个新容器,然后执行一个命令来创建新用户并添加到 sudo 组:
$ docker run --name test ubuntu:latest useradd -u 1234 -G sudo newuser
现在,根据新容器中修改后的图像创建一个新图像:
$ docker commit test test-image
<image id>
现在您有一个名为“test-image”的新映像,可以从中运行新容器。基于该映像运行新容器,以查看新用户是否在 /etc/passwd 中:
$ docker run --name test2 --rm test-image cat /etc/passwd | grep 1234
newuser:x:1234:1234::/home/newuser:
从现在开始,每个基于“test-image”的图像都将以“newuser”作为有效用户,该用户已经在 /etc/passwd 文件中并且是 sudo 组的一部分。
如果您想要进行更详细的自定义,请使用以下命令运行您的初始容器,当您满意时退出并提交,如上所示:
$ docker run --name test -it ubuntu:latest
请注意,仅将用户添加到 sudo 组可能不足以让其以 root 身份运行命令。运行“visudo”并进行适当修改。上面来自 ubuntu 的示例图像需要安装 sudo 包和编辑器,然后才允许使用 sudo。