← 返回技术随笔仓库

Docker 容器时间与时区:8 小时偏差的修复

发布时间:2026-11-10容器云原生

先分清两件事:时间值和时区显示。所有容器共享宿主机内核时钟,时间值不可能偏差;偏差的是时区解释——容器基础镜像默认 UTC,宿主机是东八区,于是同一时刻容器里显示慢 8 小时。跨日场景(凌晨的任务、按天分表的日志)直接错一天,这是最伤的。

镜像层修复(推荐):Dockerfile 里 ENV TZ=Asia/Shanghai,Debian 系还要 ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone(部分发行版 tzdata 都没装,先 apt install tzdata)。alpine 更轻的做法是 apk add tzdata 后同样链接。运行时修复:-e TZ=Asia/Shanghai 加 -v /etc/localtime:/etc/localtime:ro,只读挂载防止容器改宿主机文件。

应用层是第三关:JVM 不完全理会 TZ 环境变量,老版本要 -Duser.timezone=Asia/Shanghai 显式指定(新版本 JDK 认 TZ);Python 的 datetime.now() 跟系统时区、time.time() 是 UTC 时间戳不受影响;MySQL 容器要 default-time-zone='+08:00' 启动参数。纪律建议:存储和传输一律 UTC 时间戳,只在展示层转本地时区,能绕开这一整类问题——但国内业务库满地 datetime 默认值 CURRENT_TIMESTAMP,迁移前先统一容器和宿主机时区止血。