为何相同基础镜像执行WORKDIR命令后Docker镜像ID会出现差异
这个问题的核心原因和你使用的Docker 19.03.13版本的底层实现逻辑有关:
- 19.03.x版本的Docker在处理
WORKDIR指令时,如果目标目录不存在需要自动创建,目录的权限会继承当前构建进程的umask配置,而非固定使用默认的0755权限。 - 你两次CI运行的任务大概率被调度到了umask配置不同的节点上,导致
WORKDIR /app生成的目录权限存在差异,最终该层的哈希值计算结果不同,对应的镜像ID自然不一样,后续的构建步骤也就无法命中缓存。
可以选择以下任意一种方法解决该问题:
- 升级Docker到20.10及以上版本,该版本已经修复了这个问题,
WORKDIR自动生成的目录权限会固定为0755,不受构建环境的umask配置影响 - 在CI构建脚本的最开头统一设置umask,比如添加
umask 0022命令,保证所有构建节点的umask配置一致 - 将
WORKDIR /app替换为显式的权限控制指令:RUN mkdir -p /app && chmod 0755 /app,之后再写WORKDIR /app,手动固定目录的权限配置,避免受环境差异影响
内容的提问来源于stack exchange,提问作者Rodion Gorkovenko
相关产品推荐
相关产品推荐

