- 问题回顾:
在centos上打包springboot应用,启动镜像发布以后,执行定时任务是发现时间不对,相差了8个小时。
查询数据库数据发现时间也相差了8个小时,但是数据库中时间是正确的。
系统日志打印时间居然也相差了8个小时。 - 解决路程:
A:首先查询服务器时间是否正确。执行命名:date
发现系统时间正确,并且时区为CST。
B:进入容器内部,检查容器时间是否正确。
进入容器内部:docker exec -it [containerId] sh
执行命令:
date
发现容器内时间不对,相差8小时,并且时区为UTC。
-
停止容器,删除容器和镜像。
-
为了保证容器时区和系统时区相同,需要挂载docker的/etc/localtime到系统的/etc/localtime。
修改docker-compose.yml:volumes: - /etc/localtime:/etc/localtime
或者在Dockfile中新增命令:
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
-
重新build镜像,启动之后,进入容器检查时间已经正确。
-
到此居然天真的以为万事大吉...But查询数据库的数据页面显示居然还是相差了8个小时,检查jdbc url发现时区参数【
serverTimezone=GMT%2B8】已经进行了配置。心中一万个CNM呼啸而过...
- 查询log日志发现,居然日志时间也是相差了8个小时。冷静之后分析应该是JVM的时区不对。JVM是通过/etc/timezone文件获取时区的,需要在容器中映射或者写入时区文件。在Dockfile中新增命令:
RUN echo "Asia/Shanghai" > /etc/timezone
再次查询系统log文件和查询数据时间,显示正确!
-
最终Dockfile如下:
FROM openjdk:8u181-jdk MAINTAINER JasonJiang jasonjiang@xxx.com RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo "Asia/Shanghai" > /etc/timezone COPY target/xxx.jar /xxx.jar ENTRYPOINT ["java", "-jar", "/xxx.jar"]
Docker中部署springboot时间不对的问题
最新推荐文章于 2024-05-11 14:45:47 发布