說明:該文章是針對jenkins運行在docker容器中時,jenkins的時間與容器的時間不一致。而非jenkins直接運行在系統各種。不過解決問題的思路都是一致的。
問題
通過官方的jenkins容器運行jenkins服務,但是發現jenkins的時間與docker容器內的時間相同,但都與北京時間
正好差8個小時。基本確定時區問題
查看jenkins的docker容器時間:
docker exec
查看Jenkins的時間
在“jenkins的UI-》系統管理-》系統信息”中有user.timezone的字段
分析
時間相差8個小時,基本可以確定時區問題。所以上網搜索了些內容,基本解決辦法如下
方法1:jenkins官方修改時區的方法。但是基本都是通過修改jenkins、java的參數來達到目的的。目前使用docker容器沒辦法處理。
方法2: 修改/etc/localtime文件的方法。按照這個方法處理了,但是容器的系統時間與當地時間相同了,但是jenkins的時間還是相差8個小時。
再分析
既然docker容器的時間正確了,但是jenkins的時間還是不對的,說明jenkins的時區使用的不是/etc/localtime,而是另有他處。
在jenkins-》系統管理-》系統信息
中可以看到有關時區的是user.timezone
屬性值是Etc/UTC
。哪裏存放的這個值呢,應該是/etc/timezone了。所以嘗試下/etc/timezone的設置。
docker exec my-jenkins cat /etc/timezone
Etc/UTC
可以看到時區是Etc/UTC
,基本上可以確定是這裏導致的了
備註:通過驗證debian系列纔有timezone這個文件的,在centos中是沒有這個文件的。所以確定jenkins的docker容器是基於debian系的linux
解決
- 修改/etc/localtime,修改容器的時間
- 修改/etc/timezone,修改jenkins的時區
最終構建docker容器的命令如下(如有其他參數,請自行添加其他參數)
docker run -d --name ci --privileged=true -v /etc/localtime:/etc/localtime -v /[my_path]/timezone:/etc/timezone jenkins
或者
docker run -d --name ci --privileged=true -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime -v /[my_path]/timezone:/etc/timezone jenkins
- 將/[my_path]/timezone修改爲對應的路徑
- 如果docker宿主機系統中不存在timezone文件,可以自行創建timezone文件(或者從別的地方拷貝),timezone文件的內容如下:
Asia/Shanghai
- 如果localtime相關的文件不存在,解決思路與timezone的類似,不再贅述。