背景:
在打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构建镜像运行程序 后:
再次打印时间/时区,发现已经正常: