前阵子部署一个内部工具,容器跑起来日志时间总是差8个小时。一开始没当回事,后来排查问题的时候发现时间对不上,定位问题特别难受,这才意识到时区这事真的不能忽略。 我用的基础镜像是比较精简的alpine版本,默认时区就是UTC。网上搜了一圈,好多教程都让改环境变量TZ=Asia/Shanghai,我试了确实有效,但后来发现有的程序不认这个变量,比如Java的某些框架会直接读系统时区文件。 后来干脆在Dockerfile里加了一步安装tzdata,然后设置时区软链接。具体就是apk add tzdata,然后ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime。这样系统层面就彻底改了,不管什么程序读的都是东八区。 还有个坑是docker-compose里如果用了healthcheck,容器内部时间不对会导致健康检查的脚本判断出错,尤其是那种依赖时间戳的检查,真的会莫名奇妙报 unhealthy。 另外如果是跑数据库容器,比如MySQL或者PostgreSQL,时区不对会导致TIMESTAMP字段存储的值跟你预期差8小时,后续查询数据还得手动转换,特别烦。