Docker Ubuntu 22.04创建非root权限builder用户目录异常问题
问题场景
使用如下Dockerfile构建Ubuntu 22.04镜像时,发现创建的builder用户主目录所有者为root:
FROM ubuntu:22.04 ENV DEBIAN_FRONTEND=noninteractive RUN apt update && apt install -y sudo RUN useradd -ms /bin/bash builder RUN ls -al /home
尝试在useradd后追加chown命令(如下),问题仍未解决:
RUN useradd -ms /bin/bash builder && chown -R builder:builder /home/builder
但直接通过docker run -it ubuntu:22.04进入容器后创建该用户,主目录权限正常。宿主机为Ubuntu 22.04,Docker版本信息:
Client:
Version: 20.10.25
API version: 1.41
Go version: go1.18.1
Git commit: 20.10.25-0ubuntu1~22.04.1
Built: Fri Jul 14 21:58:09 2023
OS/Arch: linux/amd64
Context: default
Experimental: true
Server:
Engine:
Version: 20.10.25
API version: 1.41 (minimum version 1.12)
Go version: go1.18.1
Git commit: 20.10.25-0ubuntu1~22.04.1
Built: Thu Jun 29 21:21:05 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.7.2
GitCommit:
runc:
Version: 1.1.7-0ubuntu1~22.04.1
GitCommit:
docker-init:
Version: 0.19.0
GitCommit:
解决方案
方法1:使用adduser替代useradd
Ubuntu镜像中,adduser是更上层的用户创建工具,会自动处理主目录权限等细节,适合非交互场景:
FROM ubuntu:22.04 ENV DEBIAN_FRONTEND=noninteractive RUN apt update && apt install -y sudo # 非交互创建builder用户,禁用密码,跳过用户信息填写 RUN adduser --disabled-password --gecos "" builder RUN ls -al /home
方法2:修正useradd命令并确保权限操作在同一层
如果坚持使用useradd,需显式指定主目录,并确保目录创建与权限修改在同一个RUN指令中(避免Docker缓存导致权限操作失效):
FROM ubuntu:22.04 ENV DEBIAN_FRONTEND=noninteractive RUN apt update && apt install -y sudo # 显式指定主目录并同步设置权限 RUN useradd -m -d /home/builder -s /bin/bash builder && chown -R builder:builder /home/builder RUN ls -al /home
方法3:清理Docker缓存重新构建
若之前的构建缓存干扰了权限设置,执行构建时添加--no-cache参数:
docker build --no-cache -t your-image-name .
内容的提问来源于stack exchange,提问作者ozimki

