阿里云 2 核 4G 的 Debian 12 上跑 Docker 24.0,容器里 date 显示 UTC,业务日志时间比北京时间早八小时,排查问题时按时间检索一条都对不上。
一开始怀疑是「应用自己读的是 JVM 的 user.timezone,容器时区改了它还是 UTC」,查了一圈,方向不对。
排查方向其实有限,先把可能性排一排。基础镜像里没有 /etc/localtime,容器默认按 UTC 解释时间。少数情况下是docker run 没挂载宿主机的时区文件,也没设 TZ 环境变量。
另外,数据库连接串里写了 serverTimezone=UTC,写入时又被转了一次。
上来先确认容器里的时间和时区
docker exec web date '+%F %T %Z' && docker exec web cat /etc/timezone
接着挂载宿主机时区文件并设 TZ 重启
docker run -d -e TZ=Asia/Shanghai -v /etc/localtime:/etc/localtime:ro web:1.4
Java 服务显式指定时区参数
docker run -d -e JAVA_TOOL_OPTIONS='-Duser.timezone=Asia/Shanghai' web:1.4
等前面都确认过,再核对日志与数据库里的时间是否统一
docker logs --tail=5 --timestamps web
别只看报错消失,验证要多做一步。docker exec 的 date 显示 CST 且与宿主机一致,新写入的日志时间戳和数据库记录能按分钟对齐。
补一句。只设 TZ 对部分语言不生效,挂载 localtime 更稳;改时区后历史日志不会变,按时间段检索要记得这段错位。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
