Dockerfile中RUN指令间文件所有者异常变更问题咨询
Docker 20.10.25中文件所有者在快照子卷中异常变为root的问题
问题复现
使用以下Dockerfile:
FROM debian RUN touch /foo \ && chown backup /foo \ && ls -l /foo \ && sleep 10 RUN ls -l /foo
正常预期结果
两次ls输出均显示/foo的所有者为backup:
-rw-r--r-- 1 backup root 0 Aug 12 16:02 /foo [...] -rw-r--r-- 1 backup root 0 Aug 12 16:02 /foo
异常现象(Docker 20.10.25)
在升级到Docker version 20.10.25, build 20.10.25-0ubuntu1~22.04.1的PopOS环境中,第二个RUN的输出显示/foo所有者变为root:
-rw-r--r-- 1 backup root 0 Aug 12 16:34 /foo [...] -rw-r--r-- 1 root root 0 Aug 12 16:34 /foo
额外测试发现:chown后文件所有者正确,但生成镜像快照子卷时,该子卷内的文件所有者被错误重置为root。
结论
这是Docker的已知Bug,并非新特性,根源在于Ubuntu/Debian系发行版提供的20.10.25版本Docker包中,overlay2存储驱动的层快照处理逻辑存在缺陷,导致文件权限属性未被正确持久化到后续镜像层中。
解决方案
- 临时回退版本:降级到之前的稳定版本(如20.10.24)可规避该问题
- 升级修复版本:升级到Docker 20.10.26及以上版本,官方已修复该快照权限异常问题
- 临时 workaround:在
chown命令后添加一个微小的文件修改操作(比如echo "" >> /foo),强制驱动正确记录文件权限属性到快照中
内容的提问来源于stack exchange,提问作者wcxyiany
相关产品推荐
相关产品推荐

