現象:
在通過部署項目到服務器時, 發現服務器和本地查詢結果不一致, 服務器應用程序的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],CollectionName[RTINFO],操作[查詢query sort],查詢出來的數量[8], 排序[{ "TIME" : -1}], 參數[{ "DEVCODE" : "LY16C1237G0001283" , "ShuChiCanData" : { "$exists" : false} , "TIME" : { "$gte" : { "$date" : "2018-03-24T16:00:00.000Z"} , "$lte" : { "$date" : "2018-03-24T16:03:00.000Z"}}}]
通過在啟動jar時指定jvm的時區解決問題.
總結時區操作的如下方法:
修改centos7的時區:
查看系統的時區:
[root@localhost ~]# 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"]
