Dockerコンテナタイムゾーン設定および時間同期


今日、システム統合テストでは、業務データの提出時間と実際の時間(北京時間)がずれ、統計異常を招いたため、テストスタッフがテストバグを提出しました.統合テストは、コンテナの時間設定に基づいて、テスト環境としてDockerミラーを直接提供するためです.
渡されたdockerミラーを手に入れた後、起動してコンテナコンソールに入り、dateコマンドで確認するとやはり時間が正しくありません.ホスト時間が正しいことを確認すると、コンテナの起動時にホストと同期していないと判断できます.テストミラーはdockerfileによって直接構築されているため、問題は基本的にdockerfileファイルに定められています.
dockerfileチェックを開くと、シンクホストタイムゾーンと同期した設定が確実に失われていることがわかります.ここでは、タイムゾーン同期プロセスをどのように追加するかを記録し、類似の問題に遭遇した学生に参考にします.
次に、Alpineで作成したdockerミラーを例に挙げます(私たちのテストミラーでもあります).

Dockerfile修正


tzdataパッケージのインストールを追加
パッケージのインストール時にtzdataインストールパッケージをインストールし、構築に成功した後、このインストールパッケージをクリーンアップできません.
# 
ENV  TIME_ZONE Asia/Shanghai
#dockerfile 
RUN \
...
# tzdata 
&& apk add --no-cache tzdata \

タイムゾーン構成の追加
このインストールパッケージをインストールすると、/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の修正作業は終了しました.

ホストタイムゾーンと時間の確認


ホストのホスト時間と時間が正しいかどうかを確認するには、次のコマンドを使用します.
[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

これでホストタイムゾーンと時間調整が完了しました.

コンテナの再実行


上記のdockerfileに従ってミラーを再生成し、RUNコマンドを使用してコンテナを起動し、ウィンドウ時間を表示します.
/ # date
Tue Dec 13 23:01:18 CST 2016

ホストと同期し、調整プロセス全体が終了しました~~