问题:
宿主机时间是 中国标准时间 CST(UTC+8),而容器里默认是 UTC 时间
Docker 容器默认使用 UTC 时区,除非你在镜像里或运行时显式指定了其他时区。
有的镜像里连 /etc/localtime 这个文件都不存在,所以单纯挂载宿主机的 /etc/localtime 进去不会生效
分析
一条规则打天下:“只挂 zoneinfo 目录,统一用 TZ 变量指向文件,绝不碰 /etc/localtime”
所有镜像(Alpine、Debian、BusyBox、RedHat)都认 TZ 变量, BusyBox 也认“文件路径”形式的 TZ,因此无需再 ln、无需改 /etc,也无需打新镜像。
解决方法
1、只挂一条只读卷,把宿主机整个 zoneinfo 目录挂到容器同名路径:volumes:
- /usr/share/zoneinfo:/usr/share/zoneinfo:ro2、环境变量:
environment:
- TZ=Asia/Shanghai验证脚本(修改实际容器名)
for c in nginx tomcat9-jdk8 python-app; do
echo === $c ===
docker exec $c date +'%F %T %Z'
done
评论 (0)