Docker 服务器下java查询时区问题

来源:互联网 发布:java 防止url转码 编辑:程序博客网 时间:2024/06/14 03:51

最近遇到时区问题,着实让人纠结,利用docker部署spring boot 服务(服务器宿主机不是内地的,docker容器为centos7),当部署应用的时候出现了时间少8个钟或者多8个钟的问题...尝试了

jdbc连接的时区修改,最终以失败告终...

这是遇到问题的过程...:

用postman进行测试数据插入,查询数据的时候时间会与现在的时间少8个或者多8个钟.怀疑服务器时间不对,进入容器执行date命令后,发现docker时间确实不对,然后找到了docker时间同步方法(当然也可以在创建容器的时候添加环境变量实现同步).设置docker时间与服务器宿主机同步后,数据库时间插入的时间和查询时间终于都正确了.但是又发现了一个问题,假如直接用LocaldateTime.now()获取本地时间返回页面或者进行输出,而不经过数据库查询,你可以发现获取到的当前时间仍然少八个钟(最后找到原因是jre获取的时间时区不正确)最后大体解决步骤是这样的:

step1:数据库连接配置

db.url=jdbc:mysql://localhost:3306/goddess?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2b8&autoReconnect=true&failOverReadOnly=false

注意 serverTimezone必须设置时区GMT%2b8 (GMT+8)

step2: 设置docker时间与宿主机时间同步 进入docker容器,执行cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 命令,

 然后再执行date命令查看时间是否已经同步为北京时间

step3: 设置jdk读取时间文件 执行 echo "Asia/Shanghai" > /etc/timezone 命令 替换掉该文件下的"Etc/UTC"改成Asia/Shanghai,  jre是通过该配置文件读取本地时间的,如没有该文件,添加该文件(一定要注意自己的操作系统),cat  /etc/timezone 可见内容已被置为Asia/Shanghai,好了,为以防万一,重新启动docker容器即可,此时LocaldateTime.now()已经获取正确.

当然总不能每次创建容器的时候都要去修改时区,此时,我们可以写个shell脚本当容器创建的时候执行该脚本即可,可把脚本放在宿主机挂载进去,也可以在容器里编写脚本创建自己的镜像。

以java镜像为例创建一个带脚本镜像

1.创建脚本init.sh,放在/home/sh文件夹下

内容如下:

#! /bin/bash
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone
echo "set time success "
sleep 1d #休眠一天确保有一个线程在运行,否则容器会退出。

2.创建并运行容器

docker run  --name java -v /home/sh:/root java /bin/bash ./root/init.sh (挂载脚本到root目录下并在运行容器时执行该脚本)