Docker用户命名空间和sudo

我正在尝试使用用户命名空间function和sudo来获得Docker容器。 如果我用-u标志设置为一个随机的UID创build容器,那么sudo不起作用,你会得到这个消息:

sudo: unknown uid 1234: who are you?

用户显然不在/etc/passwd ,这对sudo造成了问题。 我试图让这个图像与OpenShift的默认设置,即生成一个随机的UID,这是根组(0)的一部分,但我需要以后运行固定用户的命令,所以想要使用sudo做到这一点(并严格控制哪些命令可以运行)。 如果我向/etc/passwd追加一个条目,似乎工作起来,但看起来很丑,因为它需要在每个容器启动时运行(因为/etc/passwd不在卷中)。

有没有人有任何其他的build议?

编辑:请注意,OpenShift每次运行容器时都会生成一个不同的随机UID。

我的道歉,我不熟悉OpenShift,但在一个香草的Docker环境,我build议你创build一个新的图像基于一个修改后的容器,具有所需的更改,然后从该图像运行所有新的容器。 你可以很容易地创build另一个基于你正在使用的图像,你有修改/ etc / passwd以及任何其他严格的控制你想强加的图像。

例如(我使用的是Ubuntu:最新,因为你没有提到你试图运行的实际图像)。 首先,根据select的图像运行一个新的容器,并执行一个命令来创build一个新用户并添加到sudo组中:

 $ docker run --name test ubuntu:latest useradd -u 1234 -G sudo newuser 

现在,根据新容器中的修改后的图像创build一个新的图像:

 $ 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: 

从现在开始,基于“testing图像”的每个图像将具有“newuser”作为有效用户,已经在/ etc / passwd文件中,并且是组sudo的一部分。

如果你想做更详细的定制,请使用下面的代码来运行你的初始容器,当你快乐的退出并提交如上所示:

 $ docker run --name test -it ubuntu:latest 

请注意,简单地将用户添加到sudo组可能不足以让它以root身份运行命令。 运行“visudo”并根据需要进行修改。 上面的示例图像需要安装sudo软件包和一个编辑器才能安装sudo。