今天在系統(tǒng)集成測試時(shí)由測試人員提交了一個(gè)測試bug,原因是提交業(yè)務(wù)數(shù)據(jù)時(shí)間與實(shí)際時(shí)間(北京時(shí)間)有偏差,導(dǎo)致統(tǒng)計(jì)異常。由于我們集成測試是向測試人員直接提供完整的Docker鏡像作為測試環(huán)境,原因應(yīng)該是出在容器時(shí)間設(shè)置上。
拿到交付的docker鏡像后,啟動后進(jìn)入容器控制臺,使用date命令查看果然時(shí)間不正確。再查看宿主機(jī)時(shí)間是正確,這樣肯定是容器啟動時(shí)未將時(shí)區(qū)與宿主機(jī)保持同步了,由于測試鏡像是由dockfile直接構(gòu)建,因此問題基本了定準(zhǔn)在dockerfile文件上了。
打開dockerfile檢查后發(fā)現(xiàn)確實(shí)確失與宿主機(jī)時(shí)區(qū)同步設(shè)置。故在此將如何添加時(shí)區(qū)同步過程記錄一下,同時(shí)給遇到過類似問題的同學(xué)以借鑒:
以下以Alpine制作的docker鏡像為例(也是我們的測試鏡像):
1 Dockerfile修改
1.1 增加安裝tzdata包
在安裝包時(shí)安裝tzdata安裝包,并且在構(gòu)建成功后不能清理此安裝包
1
2
3
4
5
6
7
8
|
#定義環(huán)境變量 ENV TIME_ZONE Asiz /Shanghai #dockerfile增加命令 RUN \ #安裝tzdata安裝包 && apk add --no-cache tzdata \ |
1.2 增加時(shí)區(qū)配置
安裝此安裝包后,會在/usr/share/zoneinfo目錄下生成各時(shí)區(qū)配置信息,Alpine目錄并無timezone及l(fā)ocatime配置,此時(shí)我們需要將時(shí)區(qū)值覆寫至Alpine的timezone及l(fā)ocaltime配置中,命令如下:
1
2
3
4
5
6
7
8
|
``` RUN \ ... #安裝tzdata安裝包 && apk add --no-cache tzdata \ #設(shè)置時(shí)區(qū) && echo "${TIME_ZONE}" > /etc/timezone \ && ln -sf /usr/share/zoneinfo/ ${TIME_ZONE} /etc/localtime \ |
至此,dockerfile的修改工作已經(jīng)結(jié)束。
2 宿主機(jī)時(shí)區(qū)及時(shí)間檢查
檢查宿主機(jī)時(shí)間及時(shí)間是否正確,使用以下命令:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
``` [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) // 默認(rèn)為西五區(qū) 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 #修改為東八區(qū) [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 #調(diào)整時(shí)間 [root@docker ~] # date -s "2016-12-13 21:54:20" #時(shí)間同步,不執(zhí)行則無法生效 [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 ``` |
至此宿主機(jī)時(shí)區(qū)及時(shí)間調(diào)整完畢。
3. 構(gòu)建容器測試
根據(jù)上述dockerfile重新生成鏡像,并使用RUN命令啟動容器,查看當(dāng)時(shí)窗口時(shí)間
1
2
|
/ # date Tue Dec 13 23:01:18 CST 2016 |
已與宿主同步,整個(gè)調(diào)整過程結(jié)束~~
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/javacspring/p/6172327.html