VMware中Ubuntu 22.04.3上Docker容器用户目录权限异常
问题与解决方案
环境信息
- 虚拟化平台:VMware Workstation 16.2.5/17.0.2
- 宿主机系统:Ubuntu 20.04.6/22.04.3
涉及的Dockerfile内容
FROM debian:12.1-slim WORKDIR /root RUN groupadd -f ernie-1001 -g 1001 \ && groupadd -f ernie-1000 -g 1000 \ && useradd -ms /bin/bash ernie -g 1001 -G 1000 \ && printf "ernie:ernie" | chpasswd \ && adduser ernie sudo \ && printf "ernie ALL= NOPASSWD: ALL\n" >> /etc/sudoers
操作步骤
$ sudo apt install docker-compose $ sudo docker build . -t strange:1.0 $ sudo docker run -it --name strangebase strange:1.0 root@d031fe5152e4:~# su ernie ernie@d031fe5152e4:/root$ cd ernie@d031fe5152e4:~$ ls -all
问题现象
执行上述操作后,/home/ernie目录及下属文件的属主应为ernie用户,但实际显示属主为root。添加RUN chown -R ernie:ernie /home/ernie到Dockerfile后问题仍未解决,此前在其他Ubuntu 22.04虚拟机中可正常运行。
原因分析
- 指令顺序问题:
WORKDIR /root先于用户创建指令执行,导致Docker构建上下文始终以/root为基准,后续useradd自动创建的/home/ernie目录权限未被正确应用。 - Docker构建缓存:旧的构建缓存可能保留了错误的权限配置,导致新构建的镜像仍沿用旧的权限设置。
- Debian 12基础镜像行为:Debian 12的
useradd指令在特定上下文下,自动创建的用户目录权限可能未按预期设置为对应用户。
解决方案
1. 调整Dockerfile指令顺序并确保权限设置
修改后的Dockerfile如下,将用户创建、权限设置放在WORKDIR之前,最后切换到目标用户:
FROM debian:12.1-slim RUN groupadd -f ernie-1001 -g 1001 \ && groupadd -f ernie-1000 -g 1000 \ && useradd -ms /bin/bash ernie -g 1001 -G 1000 \ && printf "ernie:ernie" | chpasswd \ && adduser ernie sudo \ && printf "ernie ALL= NOPASSWD: ALL\n" >> /etc/sudoers \ && chown -R ernie:ernie /home/ernie # 切换到ernie用户,默认工作目录设为用户主目录 USER ernie WORKDIR /home/ernie
2. 清理缓存重新构建
执行以下命令强制清理Docker构建缓存,避免旧配置干扰:
sudo docker build --no-cache . -t strange:1.0
3. 构建阶段验证权限(可选)
在Dockerfile中添加权限验证指令,构建时即可确认权限是否正确:
# 在chown指令后添加 RUN ls -ld /home/ernie
同类问题说明
这类权限异常多由Docker构建分层缓存、指令顺序错误或基础镜像用户管理行为差异导致。调整指令顺序、清理构建缓存是通用的解决思路,针对Debian 12这类较新的基础镜像,需确保用户创建及权限设置的指令逻辑连贯。
内容的提问来源于stack exchange,提问作者Ernie Sanderson
相关产品推荐
相关产品推荐

