在容器中创建用户并切换用户;
Add a new user, named user;
Let this user have root privileges;
Set its password to password;
After the Container is started, log in as user and go directly to the user's home directory;
将以下代码片段放入 Dockerfile。
RUN useradd --create-home --no-log-init --shell /bin/bash user \
&& RUN adduser user sudo \
&& RUN echo 'user:password' | chpasswd
USER user
WORKDIR /home/user
使用fixuid修改容器中非root用户的uid和gid;
用上述代码创建非root用户后,用户的uid和gid一般为1000:1000。
Docker和宿主机共用一套内核,仍然只有一套由内核控制的uid和gid。也就是说,我们在容器中作为新创建的docker用户(uid 1000)执行进程,宿主机会认为该进程是宿主机上一个uid为1000的用户执行的,而这个用户不一定是我们的账号,相当于我们的用户,用冒名顶替者代替了别人,就很难追溯到真实用户。
为了解决这个问题,可以在添加用户时指定uid为用户的uid,如1002;
RUN addgroup --gid 1002 docker && \
adduser --uid 1002 --ingroup docker --home /home/docker --shell /bin/sh --gecos "" docker
更好的解决方案是在容器启动时使用fixuid切换uid:
RUN useradd --create-home --no-log-init --shell /bin/bash user\
&& adduser user sudo \
&& echo 'user:password' | chpasswd
RUN USER=user && \
GROUP=docker && \
curl -SsL https://github.com/boxboat/fixuid/releases/download/v0.4.1/fixuid-0.4.1-linux-amd64.tar.gz | tar -C /usr/local/bin -xzf - && \
chown root:root /usr/local/bin/fixuid && \
chmod 4755 /usr/local/bin/fixuid && \
mkdir -p /etc/fixuid && \
printf "user: $USER\ngroup: $GROUP\n" > /etc/fixuid/config.yml
USER user:docker
ENTRYPOINT ["fixuid"]
这时候需要在启动容器时指定uid和gid。命令如下:
docker run --rm -it -u $(id -u):$(id -g) image-name bash