Dockerコンテナのタイムゾーンと時間の非同期の問題を解決

8564 ワード

今日、システム統合テストでは、業務データの提出時間と実際の時間(北京時間)がずれ、統計異常を招いたため、テストスタッフがテストバグを提出しました.統合テストは、コンテナの時間設定に基づいて、テスト環境として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

ホストと同期し、調整プロセス全体が終了しました~~
転載先:https://www.cnblogs.com/javacspring/p/6172327.html