记一次Docker镜像时区与程序打印时区不一致的问题

在这里插入图片描述

背景:

在打Docker镜像的包的时候,Dockerfile是基于以下镜像openjdk:8进行的
修改前的Dockerfile文件内容如下:

FROM openjdk:8
ARG app
ADD <APP> app.jar
RUN ["/bin/bash", "-c", "chmod 777 app.jar "]
CMD java -Xms512M -Xmx2048M -jar /app.jar --server.port=8080
[root@nb001 scripts]# docker images
REPOSITORY                                                           TAG        IMAGE ID       CREATED          SIZE
openjdk                                                              8          3fdc4c6136de   3 weeks ago      526MB

但是发现,在日志中打印的LocalDateTime.now() 和 TimeZone.getDefault()都小了8小时:
在这里插入图片描述
且服务器上的时间/时区也是对的:

[root@nb001 scripts]# date -R
Thu, 18 Nov 2021 15:49:10 +0800

所以怀疑是镜像里面的时区不对,故排查方式如下

1、将openjdk:8镜像运行起来

docker run -itd --name openjdk8 openjdk:8

[root@nb001 conf.d]# docker ps
CONTAINER ID   IMAGE            COMMAND     CREATED          STATUS          PORTS     NAMES                                                                        
c0802ee02685   openjdk:8        "bash"      37 minutes ago   Up 37 minutes             openjdk8                                                                                    

2、进入容器内部修改时区

执行以下命令进入容器内部:

docker exec -it c0802ee02685   bash

在容器内,按顺序执行如下命令:

# 安装tzdata
root@c0802ee02685:/# apt-get install tzdata
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
tzdata is already the newest version (2021a-1+deb11u1).
tzdata set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

# 进入时区信息目录:
root@c0802ee02685:/# cd /usr/share/zoneinfo/
root@c0802ee02685:/usr/share/zoneinfo# ls
Africa	    Arctic    Australia  CST6CDT  Cuba	EST5EDT  Etc	  GB	   GMT+0  Greenwich  Iceland  Israel   Kwajalein  MST	   NZ	    PRC      Poland    ROK	  UCT  Universal  Zulu		     leapseconds  posixrules  zone.tab
America     Asia      Brazil	 Canada   EET	Egypt	 Europe   GB-Eire  GMT-0  HST	     Indian   Jamaica  Libya	  MST7MDT  NZ-CHAT  PST8PDT  Portugal  Singapore  US   W-SU	  iso3166.tab	     localtime	  right       zone1970.tab
Antarctica  Atlantic  CET	 Chile	  EST	Eire	 Factory  GMT	   GMT0   Hongkong   Iran     Japan    MET	  Mexico   Navajo   Pacific  ROC       Turkey	  UTC  WET	  leap-seconds.list  posix	  tzdata.zi

# 将上海时区配置写入到/etc/localtime
root@c0802ee02685:/usr/share/zoneinfo# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 查看时间是否正确
root@c0802ee02685:/usr/share/zoneinfo# date
Thu Nov 18 15:24:52 CST 2021

# 保证jvm的时区正确,将Asia/Shanghai写入到 /etc/timezone
root@c0802ee02685:/usr/share/zoneinfo# echo Asia/Shanghai > /etc/timezone

# 退出容器
root@c0802ee02685:/# exit
exit

3、根据修改后的容器生成镜像

[root@nb001 scripts]# docker commit -a "wangdy" c0802ee02685 openjdk:wangdy8
sha256:29c11768ed737dd6305627f80a7d2ff30328aa7f0c1721c42848f5d169b6a2f5
[root@nb001 scripts]# docker images
REPOSITORY                                                           TAG        IMAGE ID       CREATED          SIZE
openjdk                                                              wangdy8    29c11768ed73   4 seconds ago    526MB

4、修改Dockerfile的基础镜像

使用最新生成的openjdk:wangdy8,Dockerfile文件内容修改后,如下:

FROM openjdk:wangdy8
ARG app
ADD <APP> app.jar
RUN ["/bin/bash", "-c", "chmod 777 app.jar "]
CMD java -Xms512M -Xmx2048M -jar /app.jar --server.port=8080

基于新的Dockerfile构建镜像运行程序 后:

再次打印时间/时区,发现已经正常:
在这里插入图片描述
在这里插入图片描述

END

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>