Dockerfile 里写了 ENV TZ=Asia/Shanghai,进容器执行 date 还是 UTC 时间,业务日志整体差八小时,宿主机上时间却是准的,容器里也没有别的报错。日志里能对上时间点,这种反而好排。

alpine 默认不带 tzdata,/usr/share/zoneinfo 目录基本是空的,TZ 指过去找不到对应的时区文件,只能退回 UTC 显示,变量看着生效其实没有,容器日志的时间自然就全错了。这一点先确认清楚,后面就不用反复试。

RUN apk add --no-cache tzdata
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV TZ=Asia/Shanghai
docker run --rm app:1.0 date

「容器时区 TZ」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

处理上按这个顺序:在 apk 包里先装上 tzdata 然后再设置 TZ 环境变量 一步都不能少;或者把宿主机的 localtime 文件直接挂进容器 省掉装包这一步;确认时区文件真的存在 别只看环境变量有没有设。

结果对不对很好判断,容器里 date 输出带 CST 的时间,和宿主机只差几秒,日志时间也对得上。

作者 9823189