跳至主要內容

docker run 传递用户名

Sankgao约 359 字大约 1 分钟DevOps问题jenkinsdockers

问题

以指定用户启动 docker 容器。

报错日志如下:

sudo docker run -d -u test --name jenkins jenkins/jenkins:latest

docker: Error response from daemon: unable to find user test: no matching entries in passwd file.

原因

容器中的默认用户是 rootuid = 0)。您可以设置默认用户以使用 Dockerfile USER 指令运行第一个进程。启动容器时,可以通过传递 -u 选项来覆盖 USER 指令。

docker run 命令 -u 参数,传递的用户名必须存在与容器中,如果用户名不存在容器中,则会报此错误。

以下示例均有效:

-u, --user=[ user | user:group | uid | uid:gid | user:gid | uid:group ]

参考官网:https://docs.docker.com/engine/reference/run/#useropen in new window

解决方法

传递用户时,使用数字用户 ID,此用户不必存在于容器中,但此用户 ID 必须在 0-2147483647 范围内。

通过以下命令查看 test 用户的 UID:

cat /etc/passwd | grep test

test:x:1002:1002::/opt/jenkins_home:/bin/bash

例如:

sudo docker run -d -u 1002:1002 --name jenkins jenkins/jenkins:latest

由于该 ID 不存在于容器内的 /etc/passwd 文件中,所以进入容器后,容器名显示为 I have no name!。例如:

sudo docker exec -it jenkins /bin/bash

I have no name!@87396e208b2e:/$

可以进入容器中,通过修改容器内 jenkins 用户 UID 和 GID 解决。例如:

sudo docker exec -it -u 0 jenkins /bin/bash

root@87396e208b2e:/$ usermod -u 1002 jenkins
root@87396e208b2e:/$ groupmod -u 1002 jenkins