Docker镜像跨主机运行丢失用户文件权限问题求助
问题概述
在Ubuntu 20 LTS主机上构建的Docker镜像,包含自定义非root用户dreamdocs(UID 2122,GID 515),构建主机上运行时文件权限正常,但拉取到Fedora 36/37、Minikube VM、Astra Linux等其他主机运行时,/home/dreamdocs下的文件所有者变为root,导致运行时出现Permission denied错误。仅基于自定义RedOS7.3基础镜像的镜像出现该问题,近期仅从基础镜像中移除了部分虚拟化包,旧版本镜像无此问题。
排查方向与解决方案
1. 显式确保用户目录权限正确
基础镜像的目录权限可能因虚拟化包移除出现异常,导致切换用户后创建的文件未正确继承所有者。修改Dockerfile,在创建用户后显式设置用户主目录的所有权:
# syntax=docker/dockerfile:1 ARG SYSTEM=pasaopasen/redos7.3:2023-08-06_14-01 ARG USER=dreamdocs ARG USER_ID=2122 ARG GROUP=dreamdocs ARG GROUP_ID=515 FROM ${SYSTEM} as os-base ARG USER ARG USER_ID ARG GROUP ARG GROUP_ID RUN dnf update -y && \ dnf install -y shadow-utils && \ # 确保用户管理工具完整 dnf autoremove -y && \ dnf clean all RUN groupadd -r ${GROUP} -g ${GROUP_ID} && \ useradd -u ${USER_ID} -g ${GROUP} -m ${USER} && \ # -m 参数自动创建主目录 chown -R ${USER_ID}:${GROUP_ID} /home/${USER} # 强制设置目录所有权 WORKDIR /home/${USER} USER ${USER} RUN touch file
说明:添加
shadow-utils包确保useradd/groupadd等工具功能完整;-m参数自动创建用户主目录,再显式chown确保权限绑定到指定UID/GID,避免基础镜像的目录权限异常影响。
2. 绕过缓存重新构建镜像
旧的构建缓存可能保留了基础镜像变更前的层,导致用户创建步骤异常。执行构建命令时添加--no-cache参数:
docker build --no-cache -t pasaopasen/docutable-test-perm:latest .
3. 检查Docker存储驱动差异
不同主机的Docker存储驱动(如overlay2、devicemapper)可能对UID/GID的映射处理存在差异:
- 在构建主机和目标主机分别执行命令查看存储驱动:
docker info | grep "Storage Driver"
如果目标主机使用devicemapper,可尝试在构建时显式指定overlay2驱动(需构建主机支持),或在目标主机调整Docker存储驱动为overlay2(需目标主机环境允许)。
4. 显式设置文件所有权(兜底方案)
若上述方案无效,可在创建文件后强制指定所有者,确保镜像层中文件权限正确:
# ... 其他步骤不变 ... USER ${USER} RUN touch file && chown ${USER_ID}:${GROUP_ID} file
内容的提问来源于stack exchange,提问作者Demetry Pascal

