關於docker容器時區問題,已運行和未運行的時區修改和java運行獲取的時區修改

問題:這幾天轉用docker部署項目,部署後發現在涉及時間判斷的總是出錯,查了資料發現是docker容器的默認時區是0時區的UTC時區

解決方案:

說明:我寫了個方法打印 java 獲取到的時間 Demo

一、未啓動的容器

在啓動容器的時候加上 -e TZ="Asia/Shanghai" 參數即可

docker run -e TZ="Asia/Shanghai" -d -p 80:80 --name nginx nginx

這個是最好的解決辦法,在容器內打印時間也是正常的

root@f33dc1b95772:/bootapps# date -R
Fri, 01 Nov 2019 17:31:51 +0800

java獲取到的時間也是正常的

root@f33dc1b95772:/bootapps# java Demo
new Date():Fri Nov 01 17:31:18 CST 2019
LocalDateTime:2019-11-01T17:31:18.771

二、已啓動的容器

已啓動的容器

1.修改docker容器時區

進入容器內,執行命令

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

或者

cp /usr/share/zoneinfo/Asia/Shanghai    /etc/localtime

在容器中執行 date -R 命令時區正常

root@96ce5f1aa65d:/# date -R
Fri, 01 Nov 2019 17:45:07 +0800

但是在java獲取時間的時區還是 0時區的 UTC 時區

root@96ce5f1aa65d:/bootapps# java Demo
new Date():Fri Nov 01 09:46:13 UTC 2019
LocalDateTime:2019-11-01T09:46:13.388

2.修改java獲取的時區

查資料發現 jre是通過配置文件讀取本地時間的:/etc/timezone

所以把時區加進去,進入容器內執行命令

echo "Asia/Shanghai" > /etc/timezone

現在java程序獲取的時區就是 +8時區的 CST 時區

root@96ce5f1aa65d:/bootapps# java Demo
new Date():Fri Nov 01 17:49:11 CST 2019
LocalDateTime:2019-11-01T17:49:11.578

tips:此時如果你的應用是跑着的話則需要在容器內重啓應用或者直接重啓容器

 

附:

進入容器命令  docker exec -it 容器ID或者容器名稱 /bin/bash

docker -exec -it 1e3cd9ee8cdd /bin/bash

重啓容器命令

docker restart 1e3cd9ee8cdd

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章