使用rules_docker的container_image构建镜像时文件时间戳归零如何解决
问题根本原因
io_bazel_rules_docker 规则集的 container_image 为了实现确定性构建(相同输入每次构建输出的镜像哈希完全一致),默认会强制覆盖所有添加到镜像中的文件、tar归档内部文件的时间戳为Unix纪元时间(1970-01-01 00:00:00 UTC)。
修复方案
方案1:仅针对当前镜像目标保留时间戳(推荐,不影响其他构建任务的确定性)
修改你的 container_image 配置,新增两个参数即可:
load( "@io_bazel_rules_docker//container:container.bzl", "container_image" ) container_image( name = "image", base = "@nginx//image", files = ["nginx.conf"], symlinks = { "/etc/nginx/nginx.conf": "/nginx.conf", }, tars = [":build_tar"], tags = ["catalog"], # 新增参数1:保留引入的tar包(即:build_tar)内部原有文件的时间戳 preserve_tar_timestamps = True, # 新增参数2:保留直接添加的文件(即nginx.conf)的修改时间戳 stamp = True, )
如果你的 :build_tar 是通过bazel官方的 pkg_tar 规则生成的,还需要给 pkg_tar 也添加 stamp = True 参数,避免tar包在生成阶段就已经把时间戳归零。
方案2:全局生效所有镜像构建
在执行bazel构建命令时添加全局参数,会对所有container_image目标生效:
bazel build --@io_bazel_rules_docker//container:preserve_tar_timestamps --stamp //你的镜像目标路径
注意事项
开启时间戳保留后会破坏构建确定性,相同输入代码每次构建生成的镜像哈希可能不同,如果你的生产流程依赖镜像哈希做一致性校验、增量部署,需要提前评估影响。
内容的提问来源于stack exchange,提问作者user17160464
相关产品推荐
相关产品推荐

