解決Docker容器時區及時間不同步問題


今天在系統集成測試時由測試人員提交了一個測試bug,原因是提交業務數據時間與實際時間(北京時間)有偏差,導致統計異常。由於我們集成測試是向測試人員直接提供完整的Docker鏡像作為測試環境,原因應該是出在容器時間設置上。

 
拿到交付的docker鏡像后,啟動后進入容器控制台,使用date命令查看果然時間不正確。再查看宿主機時間是正確,這樣肯定是容器啟動時未將時區與宿主機保持同步了,由於測試鏡像是由dockfile直接構建,因此問題基本了定准在dockerfile文件上了。
 
打開dockerfile檢查后發現確實確失與宿主機時區同步設置。故在此將如何添加時區同步過程記錄一下,同時給遇到過類似問題的同學以借鑒:
 
以下以Alpine制作的docker鏡像為例(也是我們的測試鏡像):
 

1 Dockerfile修改

1.1 增加安裝tzdata包

在安裝包時安裝tzdata安裝包,並且在構建成功后不能清理此安裝包
 
#定義環境變量
ENV  TIME_ZONE Asiz/Shanghai
#dockerfile增加命令
RUN \
  #安裝tzdata安裝包
  && apk add --no-cache tzdata \
 

1.2 增加時區配置

安裝此安裝包后,會在/usr/share/zoneinfo目錄下生成各時區配置信息,Alpine目錄並無timezone及locatime配置,此時我們需要將時區值覆寫至Alpine的timezone及localtime配置中,命令如下:
 
```
RUN \
...
#安裝tzdata安裝包
&& apk add --no-cache tzdata \  
#設置時區
&& echo "${TIME_ZONE}" > /etc/timezone \ 
&& ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime \
至此,dockerfile的修改工作已經結束。
 

2 宿主機時區及時間檢查

檢查宿主機時間及時間是否正確,使用以下命令:
```
[root@docker ~]# timedatectl
      Local time: Tue 2016-12-13 21:52:13 EST
  Universal time: Wed 2016-12-14 02:52:13 UTC
        RTC time: Wed 2016-12-14 02:52:13
       Time zone: America/New_York (EST, -0500)  //默認為西五區
     NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
      DST active: no
Last DST change: DST ended at
                  Sun 2016-11-06 01:59:59 EDT
                  Sun 2016-11-06 01:00:00 EST
Next DST change: DST begins (the clock jumps one hour forward) at
                  Sun 2017-03-12 01:59:59 EST
                  Sun 2017-03-12 03:00:00 EDT
#修改為東八區
[root@docker ~]# timedatectl set-timezone Asia/Shanghai
 Local time: Wed 2016-12-14 10:53:10 CST
  Universal time: Wed 2016-12-14 02:53:10 UTC
        RTC time: Wed 2016-12-14 02:53:10
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
      DST active: n/a
[root@docker ~]# date
Wed Dec 14 10:53:49 CST 2016
#調整時間
[root@docker ~]# date -s "2016-12-13 21:54:20"
#時間同步,不執行則無法生效
[root@docker ~]# clock -w 
[root@docker ~]# timedatectl
      Local time: Tue 2016-12-13 22:59:44 CST
  Universal time: Tue 2016-12-13 14:59:44 UTC
        RTC time: Tue 2016-12-13 14:59:44
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
      DST active: n/a
```
 
至此宿主機時區及時間調整完畢。

3. 構建容器測試

根據上述dockerfile重新生成鏡像,並使用RUN命令啟動容器,查看當時窗口時間
/ # date
Tue Dec 13 23:01:18 CST 2016
已與宿主同步,整個調整過程結束~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM