centos时区 & docker容器时区 & jvm时区问题 & logs时间错误

现象:

在通过部署项目到服务器时,发现服务器和本地查询结果不一致,服务器应用程序的log时间错误.
本地和服务器的log时间对比如下:

  • 服务器内docker容器的应用程序(JVM)的log时间:
2018-08-21 15:23:04.188 [http-nio-10021-exec-3] INFO  com.vdp.core.component.mongo.MongoService - DBName[gdcp],CollectionName[RTINFO],操作[查询query sort],查询出来的数量[0],排序[{ "TIME" : -1}],参数[{ "DEVCODE" : "LY16C1237G0001283","ShuChiCanData" : { "$exists" : false},"TIME" : { "$gte" : { "$date" : "2018-03-25T00:00:00.000Z"},"$lte" : { "$date" : "2018-03-25T00:03:00.000Z"}}}]
  • 本地win10:
2018-08-21 23:22:59.380 [http-nio-10021-exec-1] INFO  com.vdp.core.component.mongo.MongoService - DBName[gdcp],查询出来的数量[8],"TIME" : { "$gte" : { "$date" : "2018-03-24T16:00:00.000Z"},"$lte" : { "$date" : "2018-03-24T16:03:00.000Z"}}}]

后通过在启动jar时通过之前jvm的时区解决.

总结时区操作的如下方法:

修改centos7的时区:

查看系统的时区:

[[email protected] ~]# date  
Wed Aug 22 09:49:56 CST 2018

CST是为美国、澳大利亚、古巴或中国的标准时间. 如果不是CST那么肯定时区错误. 再查看和当前时间是否一致,如果不一致也可以判断为时区错误,可以通过如下命令修改时区:

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

修改容器时区:

docker容器启动后,可以通过命令:docker exec -it 64163d31888d bash进入容器,容器时区不对,通过在dockerfile添加如下配置解决:

volumes:  
      - /etc/localtime:/etc/localtime  
    privileged: true

完整的dockerfile实例如下:

version: ‘3‘
networks:
  docker_vdp-network:
    external: true
services:
  dqs-servier1:
    image: XX.XX.187.150:8082/vdp/vdp-cloud-dqs:0.0.1
    networks:
      - docker_vdp-network
    volumes:
      - /etc/localtime:/etc/localtime
    privileged: true
    ports:
      - "10021:10021"

启动jar的时候指定时区:

在我们运行应用程序时,可能JVM的时区和系统的时区不一致,那么在执行java -jar的时候添加参数-Duser.timezone=GMT+08.
下面的在dockerfile中启动应用程序的示例:

#docker search jdk找到的最小jdk基础镜像
FROM airdock/oracle-jdk
VOLUME /tmp
ADD vdp-cloud-dqs-1.0.0-SNAPSHOT.jar /app.jar
EXPOSE 10021
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Duser.timezone=GMT+08","-jar","/app.jar"]

相关文章

linux下开机自启: 在/etc/init.d目录下新建文件elasticsear...
1、因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以...
最简单的查看方法可以使用ls -ll、ls-lh命令进行查看,当使用...
ASP.NET Core应用程序发布linux在shell中运行是正常的。可一...
设置时区(CentOS 7) 先执行命令timedatectl status|grep &...
vim /etc/sysconfig/network-scripts/ifcfg-eth0 B...