容器时间差是怎么来的
容器默认使用协调世界时,日志与宿主差几个小时属于时区差异而不是故障。可以用环境变量指定时区,但要注意精简镜像可能没有包含时区数据,这种情况下设置了也不会生效。
基本信息
| 默认 | 多数官方镜像为协调世界时 |
|---|---|
| 设置方式 | 通过环境变量指定时区 |
| 依赖 | 镜像内需包含时区数据 |
| 验证 | 在容器内执行日期命令对比 |
| 适用平台 | 所有 Docker 平台 |
典型使用场景
- 核对日志时间与宿主不一致的问题
- 应用对时间敏感时确认时区设置
- 排查设置了时区却不生效的情况
- 统一跨地域部署的时间口径
- 分析测试环境与生产环境时区不同带来的现象
设置与核对
设置与核对
docker run --rm alpine date # 默认时间
docker run --rm -e TZ=Asia/Shanghai alpine date # 指定时区
docker run --rm -e TZ=Asia/Shanghai alpine sh -c \
'ls /usr/share/zoneinfo/Asia/Shanghai || echo 缺时区数据'
docker exec app date # 运行中核对关注点与注意事项
| 关注点 | 默认表现 | 注意 |
|---|---|---|
| 容器时间 | 协调世界时 | 与宿主可能有小时差 |
| 设置生效前提 | 镜像内包含时区数据 | 精简镜像常缺失 |
| 挂载宿主时区文件 | 部分场景可用 | 跨平台与滚动重启下不稳 |
| 展现层时间 | 由应用决定 | 建议统一口径后再转换 |
跨时区协作把容器统一用协调世界时、在展现层再转换,往往比逐个容器设置更容易维护。
把宿主时区文件挂进容器的方式在跨平台与滚动重启下不稳定,长期方案要重新评估。
设置时区后没有生效,先查镜像是否带时区数据,而不是怀疑命令写错。
定时任务类应用要特别确认时区口径,否则会在预期之外的时间点触发。
日志平台与容器的时间口径不一致时,排障要先确认采集与展示环节是否做了转换。
时区只在时间格式化与展示环节起作用,时间戳本身与时区无关;排查时间问题时先分清存的是时间戳还是本地时间字符串。