docker 容器内默认时区为UTC时区,比北京时间慢了8小时。
方案一
在Java应用中,所有基于默认时区的操作 Calendar.getInstance()
, TimeZone.getDefault()
等都会使用 -Duser.timezone
的配置,若无此配置,则会使用服务器时区。
增加启动参数
1 | -Duser.timezone=Asia/Shanghai |
这种方式未修改容器内时区,依然存在时区风险。
方案二
解决方式:docker-compose.yml内添加挂载localtime
和timezone
(存储当前时区信息)使容器时区和主机保持一致。
仅挂载localtime时查看容器内时区发现正常生效,但对Java应用仍不起作用。
1 | volumns: |
主机修改时区
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
也可解决。
添加zoneinfo
和 localtime
挂载
1 | volumns: |
或是容器启动后,手动添加软引用,这样可仅挂载zoneinfo
1 | ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |