Linux Docker springboot jar 日志时间不正确

使用Springboot项目的jar,制作了一个Docker镜像,启动该镜像后发现容器和容器中的Springboot 项目的日志时间不正确。

解决

1. 容器与宿主机同步时间

在启动镜像时候把操作系统的时间通过"只读"的方式挂载到容器中

命令行配置

-v /etc/localtime:/etc/localtime:ro

如:
docker -it -v /etc/localtime:/etc/localtime:ro centos bash

docker compose配置方式

volumes:
  -  /etc/localtime:/etc/localtime:ro

2. Spring boot Jar 启动时增加时区参数

在制作镜像时候,运行jar时指定上时区参数,以便Springboot项目中的日志中能够正确读取到指定时区的时间。中国采用东八区的时区,所以是GMT+8

-Duser.timezone=GMT+8

如:
java -jar -Duser.timezone=GMT+8 your_application.jar

对应的Dockerfile应该为

ENTRYPOINT ["java", "-jar", "-Duser.timezone=GMT+8", "/app.jar"]

实验以及解决过程

Spring boot的jar名称为test-dock-datetime-0.0.1-SNAPSHOT.jar

Dockerfile如下

FROM openjdk:8-jre
MAINTAINER hznu@cliven
VOLUME /tmp
COPY test-dock-datetime-0.0.1-SNAPSHOT.jar /app.jar

EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]

容器运行命令

 docker run -it -p 8080:8080 test-dock-datetime:0.0.1-SNAPSHOT

发现日志时间都不正确

linux 上的时间为Sun Mar 3 15:15:53 CST 2019

通过exec到容器中确认时间,Sun Mar 3 07:17:20 UTC 2019,偏差极大

docker exec -it container_id bash

首先解决容器中的时间与宿主机的时间不一致的问题,
命令行配置

docker run -it -p 8080:8080 -v /etc/localtime:/etc/localtime:ro test-dock-datetime:0.0.1-SNAPSHOT

再次运行可以看到容器中的时间和宿主机的时间已经保持一致。

接下来我们在观察一下Spring boot 的启动日志
启动日志

发现时间仍然不对,导致这个的原因是没有为该应用设置时区,所以采用了0区的时间,那么我们需要在jar的启动命令上加上时区参数。

修改Dockerfile,加入-Duser.timezone=GMT+8启动参数,表示东8的时区。

FROM openjdk:8-jre
MAINTAINER hznu@cliven
VOLUME /tmp
COPY test-dock-datetime-0.0.1-SNAPSHOT.jar /app.jar

EXPOSE 8080
ENTRYPOINT ["java", "-jar", "-Duser.timezone=GMT+8","/app.jar"]

修改Dockerfile 后需要重新打包镜像,重新打包镜像,运行后可以看到Springboot 的启动的日志中的时间都已经是正确的时间。

正确时间

参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值