Dockerコンテナタイムゾーン設定および時間同期
7395 ワード
今日、システム統合テストでは、業務データの提出時間と実際の時間(北京時間)がずれ、統計異常を招いたため、テストスタッフがテストバグを提出しました.統合テストは、コンテナの時間設定に基づいて、テスト環境としてDockerミラーを直接提供するためです.
渡されたdockerミラーを手に入れた後、起動してコンテナコンソールに入り、dateコマンドで確認するとやはり時間が正しくありません.ホスト時間が正しいことを確認すると、コンテナの起動時にホストと同期していないと判断できます.テストミラーはdockerfileによって直接構築されているため、問題は基本的にdockerfileファイルに定められています.
dockerfileチェックを開くと、シンクホストタイムゾーンと同期した設定が確実に失われていることがわかります.ここでは、タイムゾーン同期プロセスをどのように追加するかを記録し、類似の問題に遭遇した学生に参考にします.
次に、Alpineで作成したdockerミラーを例に挙げます(私たちのテストミラーでもあります).
tzdataパッケージのインストールを追加
パッケージのインストール時にtzdataインストールパッケージをインストールし、構築に成功した後、このインストールパッケージをクリーンアップできません.
タイムゾーン構成の追加
このインストールパッケージをインストールすると、/usr/share/zoneinfoディレクトリの下にタイムゾーン構成情報が生成されます.Alpineディレクトリにはtimezoneおよびlocatime構成はありません.この場合、タイムゾーン値をAlpineのtimezoneおよびlocaltime構成に上書きする必要があります.コマンドは次のとおりです.
これでdockerfileの修正作業は終了しました.
ホストのホスト時間と時間が正しいかどうかを確認するには、次のコマンドを使用します.
これでホストタイムゾーンと時間調整が完了しました.
上記のdockerfileに従ってミラーを再生成し、RUNコマンドを使用してコンテナを起動し、ウィンドウ時間を表示します.
ホストと同期し、調整プロセス全体が終了しました~~
渡された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
ホストと同期し、調整プロセス全体が終了しました~~