docker中的用户说明

以下内容适用于docker未使用的user namespace的情况

linux系统中的uid和gid是由内核负责管理的,而且内核管理是使用的是id不是name。同一台宿主机中运行的不同的docker和宿主机共享同一个内核,所以所有的docker中的uid和gid的管理和宿主机也都是一致的。即docker中的uid为1000的用户和宿主机中uid为1000的用户实质上是同一个用户。默认情况下docker启动时,都是采用的root账号,相当于容器中的应用对宿主机有完全的控制权限,这种做法时不安全的,所以需要对容器运行时指定一个具有合适权限的用户。

不同docker之间以及docker和宿主机中同一个uid可能对应不同的的用户名称,这是因为uid到用户名的解析(用户态程序)不同而已。

指定docker运行使用的用户

Dockerfile中使用USER命令指定

下面是jenkins的dockerfile中关于USER使用的节选

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# ......
ARG user=jenkins
ARG group=jenkins
ARG uid=1000
ARG gid=1000

# Jenkins is run with user `jenkins`, uid = 1000
# If you bind mount a volume from the host or a data container,
# ensure you use the same uid
RUN mkdir -p $JENKINS_HOME \
&& chown ${uid}:${gid} $JENKINS_HOME \
&& groupadd -g ${gid} ${group} \
&& useradd -d "$JENKINS_HOME" -u ${uid} -g ${gid} -m -s /bin/bash ${user}

# ......

RUN chown -R ${user} "$JENKINS_HOME" "$REF"

# .....
USER ${user}
# ......

docker run 命令行参数中指定用户

1
docker run -d --user 1000 ubuntu sleep infinity