"我没有名字!"用户在使用Tini

时间:2016-06-15 12:56:29

标签: shell unix jenkins ssh docker

我目前在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:

还尝试了其他名称,例如yesihaveanameyesihaveagroup,而不是jenkins

UPDATE2

我一直与Tini的developer保持联系,他不相信这个问题的原因是Tini因为它没有弄乱uid或gid,任何其他线索都会被贬值。

1 个答案:

答案 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”条目,并将此长奇数字符串复制到第一个“:”之后,直到第二个“:”