docker容器时区问题

docker 容器内默认时区为UTC时区,比北京时间慢了8小时。

方案一

在Java应用中,所有基于默认时区的操作 Calendar.getInstance(), TimeZone.getDefault() 等都会使用 -Duser.timezone 的配置,若无此配置,则会使用服务器时区。

增加启动参数

1
-Duser.timezone=Asia/Shanghai

这种方式未修改容器内时区,依然存在时区风险。

方案二

解决方式:docker-compose.yml内添加挂载localtimetimezone(存储当前时区信息)使容器时区和主机保持一致。

仅挂载localtime时查看容器内时区发现正常生效,但对Java应用仍不起作用。

1
2
3
volumns:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro

主机修改时区

1
timedatectl set-timezone Asia/Shanghai

或是创建符号链接

1
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

查看主机时区

1
date

查看容器内时区

1
docker exec -it <cid> date

方案三

/etc/localtime/usr/share/zoneinfo/ 的软引用,挂载zoneinfo目录和localtime也可解决。

添加zoneinfolocaltime 挂载

1
2
3
volumns:
- /usr/share/zoneinfo:/usr/share/zoneinfo:ro
- /etc/localtime:/etc/localtime:ro

或是容器启动后,手动添加软引用,这样可仅挂载zoneinfo

1
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime