RHEL 8运行Docker容器创建文件umask为027如何修改为0022
问题背景
在RHEL 8.8服务器上运行nginxinc/nginx-unprivileged:stable-alpine Docker镜像时,容器内启动过程创建的目录、文件umask为0027。
当前环境信息:
- Docker版本为
20.10.17,已在systemd配置中为docker.service设置UMask为0022 - 服务器系统全局默认umask为
0027,因安全合规要求无法修改该全局配置 - 执行命令验证docker服务配置输出如下:
# systemd-analyze dump |egrep -i 'docker|umask' ReferencedBy: docker.service (destination-file) UMask: 0022
RHEL 8环境启动的容器内文件权限如下,多数目录、文件权限为rwxr-x---,匹配umask 0027的权限计算结果:
# ls -l total 76 drwxr-x--- 1 root root 4096 Jun 16 21:57 app drwxr-x--- 1 root root 4096 Jun 16 21:57 bin drwxr-x--- 5 root root 360 Jun 17 20:18 dev drwxr-x--- 1 root root 4096 Jun 16 21:57 docker-entrypoint.d -rwxr-x--- 1 root root 1202 Jun 16 21:57 docker-entrypoint.sh drwxr-x--- 1 root root 4096 Jun 17 20:18 etc drwxr-x--- 2 root root 4096 Jun 16 21:57 home drwxrwxrwt 1 root root 4096 Jun 16 21:57 tmp drwxr-x--- 1 root root 4096 Jun 16 21:57 usr drwxr-x--- 1 root root 4096 Jun 16 21:57 var
相同镜像在Windows环境启动时,容器内文件目录权限为rwxr-xr-x,匹配umask 0022的权限计算结果,输出如下:
ls -l drwxr-xr-x 2 root root 4096 May 23 16:51 bin drwxr-xr-x 5 root root 360 Jun 17 18:39 dev drwxr-xr-x 1 root root 4096 Jun 16 10:36 docker-entrypoint.d -rwxr-xr-x 1 root root 1202 Jun 16 10:36 docker-entrypoint.sh drwxr-xr-x 1 root root 4096 Jun 17 18:39 etc drwxr-xr-x 2 root root 4096 May 23 16:51 home drwxr-xr-x 1 root root 4096 May 23 16:51 usr drwxr-xr-x 1 root root 4096 May 23 16:51 var
目标:不修改系统全局默认umask的前提下,让RHEL 8上Docker启动的容器内文件系统创建操作使用0022 umask。
根因说明
systemd配置中为docker.service设置的UMask参数仅作用于dockerd守护进程本身,不会自动同步给容器内的初始进程。容器内1号进程的umask默认继承dockerd进程的实际运行时umask:如果docker服务未正确重载配置、未重启,或配置加载存在异常,dockerd实际持有的umask仍为系统默认的0027,所有启动的容器都会继承该值,最终出现文件权限不符合预期的现象。
解决方案
按优先级从高到低可选择以下方案,所有方案均不会修改系统全局默认umask,符合合规要求:
- 方案1:修正docker服务的systemd配置,确保dockerd进程运行时umask为0022
操作步骤:- 执行
systemctl edit docker.service创建systemd override配置文件,填入以下内容(不要直接修改/usr/lib/systemd/system/下的原生unit文件,避免包升级时配置被覆盖):
[Service] UMask=0022- 保存退出后依次执行
systemctl daemon-reload、systemctl restart docker重载配置并重启docker服务。 - 验证配置生效:先执行
pidof dockerd获取dockerd进程PID,再执行grep Umask /proc/<对应PID>/status,如果输出Umask: 0022即说明dockerd进程umask配置正确,后续新启动的容器会自动继承该umask值,文件权限与Windows环境表现一致。
- 执行
- 方案2:若Docker 20.10.17版本存在umask传递bug导致方案1不生效,启动容器时显式指定umask参数
docker run启动时添加--umask 0022参数即可直接指定容器内初始进程的umask,覆盖继承值,示例:
该配置为单容器粒度,不影响全局服务配置。docker run -d --umask 0022 nginxinc/nginx-unprivileged:stable-alpine - 方案3:若使用docker-compose部署,在服务定义中添加umask字段即可,配置示例:
services: nginx: image: nginxinc/nginx-unprivileged:stable-alpine umask: 0022 # 其余原有业务配置保持不变
验证方式
配置完成后执行以下命令启动临时测试容器:
docker run --rm nginxinc/nginx-unprivileged:stable-alpine sh -c "umask && ls -l /"
输出umask值为0022、根目录下目录权限均为rwxr-xr-x即表示配置生效。
内容的提问来源于stack exchange,提问作者sfgroups
相关产品推荐
相关产品推荐

