Docker宿主机时间与容器时间不一致问题

发布时间 2023-07-07 15:58:26作者: 爱就码上行动

查看宿主机时区和时间:

[root@iZbp19plg6p1ajmesvagqvZ ~]# timedatectl
               Local time: 五 2023-07-07 15:28:28 CST
           Universal time: 五 2023-07-07 07:28:28 UTC
                 RTC time: 五 2023-07-07 07:28:27
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: n/a
          RTC in local TZ: no
[root@iZbp19plg6p1ajmesvagqvZ ~]# date
2023年 07月 07日 星期五 15:30:10 CST

进入容器查看容器时间:

[root@iZbp19plg6p1ajmesvagqvZ ~]# docker exec -it hello-jenkins bash
root@5cb7e14e4f12:/# date
Fri Jul  7 07:32:47 UTC 2023

可以看到,默认容器的时间是UTC标准时间,而我们的宿主机使用的是东八区时间,此时可以在容器启动时挂载本机时间到容器中:

-v /etc/localtime:/etc/localtime

如果容器不方便重新创建,可以复制一份过去:

docker cp /etc/localtime {容器id或容器name}:/etc/localtime

再次查看容器时间:

[root@iZbp19plg6p1ajmesvagqvZ ~]# docker exec -it hello-jenkins bash
root@a6cbf1b8666c:/# date
Fri Jul  7 15:44:27 CST 2023

此时,容器时间和宿主机保持一致。

如果容器运行的是Java程序,比如在代码中输出指定格式时间,调用方法时依然返回标准时间:

return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
// 2023-07-07 07:49:41

此时,需要在启动容器加上指定时区即可

 -e TZ="Asia/Shanghai"

此时输出时间变为:2023-07-07 15:53:49