今天在系統集成測試時由測試人員提交了一個測試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
已與宿主同步,整個調整過程結束~~