我目前在docker container内使用Jenkins实例。 此图像恰好使用Tini作为PID 1。 当我尝试用它打开一个shell时:
$ docker exec -it jenkins /bin/bash
我将此作为用户名:
I have no name!@<container_id_hash>:/$
这使我无法使用在此容器内运行的Jenkins作业的shell生成的ssh命令:
$ ssh
$ No user exists for uid 497
$ id
$ uid=497 gid=495 groups=495
我尝试在/ etc / passwd中为该uid创建一个用户,并在/ etc / group中为该gid创建一个组,但这是没有优惠!
如果我以jenkins用户身份登录,我只能手动运行ssh:
$ docker exec -it --user=jenkins jenkins /bin/bash
我可以使用与ssh相关的插件来绕过它。但我真的很好奇理解为什么只有使用Tini作为ENTRYPOINT的docker图像才会发生这种情况。
UPDATE1
我在/ etc / passwd中做了类似的事情:
jenkins:x:497:495::/var/jenkins_home:/bin/bash
和/ etc / group:
jenkins:x:495:
还尝试了其他名称,例如yesihaveaname
和yesihaveagroup
,而不是jenkins
UPDATE2
我一直与Tini的developer保持联系,他不相信这个问题的原因是Tini因为它没有弄乱uid或gid,任何其他线索都会被贬值。
答案 0 :(得分:2)
更新
很高兴知道(这很容易,所以一段时间以来我都忽略了这个* facepalm *):
要以root用户身份登录到容器,只需将--user root
赋予您的exec命令-如:
docker exec -ti -u root mycontainername bash
...无需复制passwd文件并设置pw哈希值……>
就像您发布的链接所述,容器内的UserID可能未分配名称。
(尽管我不使用Tini ...),我解决了以下问题:
1。)在容器(docker exec -ti mycontainername sh
)内执行:
id # shows the userid (e.g. 1234) and groupid (e.g. 1235) of the current session
2。)在容器外部执行(在本地计算机上):
docker cp mycontainername:/etc/passwd /tmp # this copies the passwd-file to from inside the container to my local /tmp-directory
echo "somename:x:1234:1235:somename:/tmp:/bin/bash" >> /tmp/passwd # add some username *!!with the userid and groupid from the output!!* of the `id` command inside the container (CAUTION: do NOT overwrite, do JUST APPEND to the file) - "1234" is just exemplary, do not use it
docker cp /tmp/passwd mycontainername:/etc/passwd # copy the file back, overwriting the /etc/passwd inside the container
现在再次登录到容器(docker exec -ti mycontainername sh
)。
P.S。
如果您知道容器的root密码,现在可以切换到root
如果没有,您可以将“ / etc / shadow”文件从容器中复制出来(如上),然后使用已知的密码哈希**编辑根条目,然后将其复制回容器中并然后登录到容器并运行su
)
** 在您的本地系统上获取此密码哈希:
(1)添加一个临时测试用户(sudo useradd testdumpuser
)
(2)为该用户提供密码(sudo passwd testdumpuser
)
(3)在/etc/shadow
文件中查找“ testdumpuser”条目,并将此长奇数字符串复制到第一个“:”之后,直到第二个“:”