Docker 用户命名空间和 sudo

Docker 用户命名空间和 sudo

我正在尝试使用用户命名空间功能和 来让 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。

相关内容