一、背景
系统打印日志时间小8h
,部分插入mysql的日期却大8h
,简直诡异。
测试时间是上午10:05
经过排查,mysql设置的时区,链接url设置的时区都是ok的。而且有其他服务时间正常,故排除MySQL的问题。
二、排查
2.1 查看服务器时间 ok的
[root@nb002 ~]# date
2023年 05月 05日 星期五 10:07:24 CST
2.2 查看所在容器系统时间 不对少8h
查看所在容器系统时间命令:
docker exec -it 容器id date
[root@nb002 ~]# docker exec -it f9bd68ffc5d0 date
Fri May 5 02:02:02 UTC 2023
2.3 再看一个时间正确的服务所在容器的系统时间 ok的
[root@nb002 ~]# docker exec -it 19cb8f93385d date
Fri May 5 10:02:40 CST 2023
三、解决办法
3.1 修改基础镜像系统时区
找到服务Dockerfile的基础镜像对应的容器
[root@nb001 dicjdk8]# docker ps | grep jdk
992ca6b4fcca openjdk:8 "bash" 10 months ago Up 10 months dicjdk8
查看容器的时间,发现是少8h的
[root@nb001 dicjdk8]# docker exec -it 992ca6b4fcca date
Fri May 5 02:27:34 UTC 2023
进入容器修改系统时区
[root@nb001 dicjdk8]# docker exec -it 992ca6b4fcca bash
找到上海时区的位置(/usr/share/zoneinfo/Asia下的Shanghai)
root@992ca6b4fcca:/# cd /usr/share/zoneinfo/Asia
root@992ca6b4fcca:/usr/share/zoneinfo/Asia# ls
Aden Ashgabat Bangkok Chita Damascus Gaza Irkutsk Kamchatka Kolkata Macau Novokuznetsk Pyongyang Saigon Srednekolymsk Thimbu Ulan_Bator Yangon
Almaty Ashkhabad Barnaul Choibalsan Dhaka Harbin Istanbul Karachi Krasnoyarsk Magadan Novosibirsk Qatar Sakhalin Taipei Thimphu Urumqi Yekaterinburg
Amman Atyrau Beirut Chongqing Dili Hebron Jakarta Kashgar Kuala_Lumpur Makassar Omsk Qostanay Samarkand Tashkent Tokyo Ust-Nera Yerevan
Anadyr Baghdad Bishkek Chungking Dubai Ho_Chi_Minh Jayapura Kathmandu Kuching Manila Oral Qyzylorda Seoul Tbilisi Tomsk Vientiane
Aqtau Bahrain Brunei Colombo Dushanbe Hong_Kong Jerusalem Katmandu Kuwait Muscat Phnom_Penh Rangoon Shanghai Tehran Ujung_Pandang Vladivostok
Aqtobe Baku Calcutta Dacca Famagusta Hovd Kabul Khandyga Macao Nicosia Pontianak Riyadh Singapore Tel_Aviv Ulaanbaatar Yakutsk
```shell
# 查看容器内当前的时区 是UTC
root@992ca6b4fcca:/usr/share/zoneinfo/Asia# cd /etc/
root@992ca6b4fcca:/etc# cat localtime
TZif2UTCTZif2UTC
UTC0
将Asia/Shanghai覆盖当前时区
root@992ca6b4fcca:/etc# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
root@992ca6b4fcca:/etc# date
Fri May 5 10:30:40 CST 2023
root@992ca6b4fcca:/etc#
3.2 修改Java所用时区
查看当前时区:是UTC
root@992ca6b4fcca:/etc# cat /etc/timezone
Etc/UTC
将Asia/Shanghai覆盖当前Java所用时区
echo /usr/share/zoneinfo/Asia/Shanghai > /etc/timezone
再次查看确认:
root@992ca6b4fcca:/usr/share/zoneinfo# cat /etc/timezone
/usr/share/zoneinfo/Asia/Shanghai
最后exit退出容器
3.3 重新打包docker镜像
命令:
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
完整示例:
docker commit -a "wangdy" 992ca6b4fcca reg.wangdy.com:9443/k8snb/openjdk:dic-cst-jdk8
3.4 推送到docker镜像仓库
这里是harbor
docker push reg.wangdy.com:9443/k8snb/openjdk:dic-cst-jdk8
3.5 对于有问题的服务,重新打包部署
修改Dockerfile
FROM reg.wangdy.com:9443/k8snb/openjdk:dic-cst-jdk8
ARG app
ADD <APP> app.jar
RUN ["/bin/bash", "-c", "chmod 777 app.jar "]
CMD java -Xms512M -Xmx2048M -jar /app.jar --server.port=8080
3.6 测试,看时间
之前错误的日志时间:已正确。
之前错误功能的时间: 已正确。