柚子生活

www.pomelolive.com

解决Docker容器new Date()时间比北京时间早八个小时问题

前言

为了知道Docker容器有没有正常启动,于是我就把Docker容器的一些信息写入redis。其中有一个数据是new Date()获得的启动时间,以容器方式部署在linux上面发现这个启动时间比北京时间早了八个小时。很自然的想到安装linux的时候时间没有配置成北京时间。

CentOS修改默认时间

把linux时间配置成北京时间(也就是中国标准时间或者东八区时间或者上海时间叫法很多)。

ln -sf /usr/share/zoneinfo/PRC /etc/localtime #创建一个软链接

然后查看时间timedatectl

[root@localhost bin]# timedatectl
      Local time: Tue 2020-05-12 16:44:26 CST
  Universal time: Tue 2020-05-12 08:44:26 UTC
        RTC time: Tue 2020-05-12 08:44:26
       Time zone: PRC (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

修改完毕,把之前的容器停止删除,然后重新启动一个容器。发现没有生效。

进入容器终端查看时间

docker exec -it [容器id] sh

这边还是早了八个小时。

[root@localhost bin]# docker exec -it c645 sh
/ # date
Tue May 12 07:48:15 UTC 2020

很自然的想到应该是容器时区问题了。

通过-v参数启动容器

然后是在网上查阅有关Docker容器时间早了八个小时问题。很多帖子说启动加一个参数-v /etc/localtime:/etc/localtime:ro

于是我又开始测试

[root@localhost ~]# docker run -d -p 5200:5200 -v /etc/localtime:/etc/localtime:ro 8c8d46b8a6f0
616147ff9928e366b87b3850c7446564dd5c9a59da347c5f543099466d2aa06c
[root@localhost ~]# 
[root@localhost ~]# docker exec -it 6161 sh
/ # date
Tue May 12 16:17:51 CST 2020

奇迹发现了。进入终端date查看的时间是对了。

但是,redis记录的时间还是早了八个小时

redis时间:2020-05-12 08:17:36

于是又开始网上搜索资料

通过Dockerfile配置参数

在Dockerfile添加以下内容

ENV TIME_ZONE PRC
RUN apk add --no-cache tzdata && \
	echo "${TIME_ZONE}" > /etc/timezone && \
	ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime

参数说明:

ENV TIME_ZONE PRC

定义环境变量TIME_ZONE值为PRC,PRC是中华人民共和国的意思。意思是把时区设置成了中国标准时间。

更多的时区可以这样查询

ls /usr/share/zoneinfo

apk add --no-cache tzdata

安装zddata时区配置信息安装包,安装完成后会在/usr/share/zoneinfo目录下生成世界各地的时区配置信息。

echo "${TIME_ZONE}" > /etc/timezone

把时区"PRC"写入文件/etc/timezone,8-jdk-alpine镜像里面没有/etc/timezone,这个文件是让new Date()获得的时间为环境变量配置的时间。

ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime

创建软链接修改本地默认时区为"PRC",8-jdk-alpine镜像里面同样没有/etc/localtime,这个文件的作用应该就是跟上面-v参数一样了。

思考

把时区写死在环境变量中感觉不好,要怎么才可以获得宿主机的时区呢?

发表评论:

Powered By Z-BlogPHP

© CopyRight 2019-2020 pomelolive.com, 京ICP备19052672号