タイムゾーンは、アプリケーションをコンテナ化する際の一般的な混乱の原因です。 cronタスクは適切なタイミングで実行されますか? Dockerコンテナーはホストのタイムゾーンを継承しないため、アプリケーションに大混乱をもたらす予期しないスケジューリングの問題が発生する可能性があります。
こちらがdate
英国のサマータイムゾーンでUbuntu20.04ホスト上でネイティブに実行されるコマンド:
そして、これは、変更されていないubuntu:20.04
に基づくコンテナ内の同じコマンドです。 画像:
コンテナはUTCタイムゾーンを使用しており、2つの時間の間に1時間の差が生じます。
Linuxタイムゾーンはどのように機能しますか?
ほとんどのLinuxディストリビューションはtzdata
を使用します タイムゾーン情報を提供するパッケージ。 tzdata
の場合 がインストールされている場合は、/etc/timezone
を読み取ることで現在のタイムゾーンを調べることができます ファイル:
/etc/localtime
もあります ファイル。これは、選択した場所の正しいタイムゾーンデータベースへのシンボリックリンクです:
タイムゾーンを変更する場合は、dpkg-reconfigure tzdata
を使用してください 、/etc/localtime
シンボリックリンクは、新しいデータベースを指すように更新されます。 date
などのコマンドの出力 アクティブなタイムゾーンのオフセットが含まれるように調整されます。
コンテナの課題は、最初にタイムゾーンを設定することに由来します。ホストをセットアップしたときを振り返ると、オペレーティングシステムのインストールの一部としてタイムゾーンを設定する必要があります。新しいコンテナを実行すると、「インストール」段階なしですぐに起動します。適切なタイムゾーンを選択する機会はありません。
理論的には、コンテナランタイムは、ホストのタイムゾーンの自動継承を提供できます。リモート環境にデプロイすると予期しない結果が生じる可能性があるため、これは発生しません。 cronスケジュールはローカルマシンで機能しますが、UTC時間を使用してマネージドKubernetesクラスターで予期せず実行されることは見過ごされがちです。
コンテナイメージは、代わりにベイクインされたタイムゾーンで出荷されます。最も人気のある画像の場合、これはUTCになります。多くのベース画像、特に最小限の画像には、tzdata
も含まれていません。 パッケージ。 /etc/timezone
はありません または/etc/localtime
ファイル。
適切なタイムゾーンを設定する最初の部分は、tzdata
を確認することです。 がインストールされています。画像に含まれていない場合は、Dockerfile
の一部としてパッケージを手動で追加する必要があります 。
FROM ubuntu:latest ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y tzdata
tzdata
の場合 インストールすると、通常、メニューから正しいタイムゾーンを選択できるインタラクティブなプロンプトが表示されます。これは、Dockerコンテナをプログラムで構築する場合には役に立ちません。 DEBIAN_FRONTEND
の設定 環境変数はプロンプトを抑制し、タイムゾーンをデフォルトでUTCに設定します。
tzdata
を取得したら 画像に挿入すると、アプリケーションの正しいタイムゾーンを設定する準備が整います。最も簡単なアプローチは、TZ
を設定することです 使用するタイムゾーンの環境変数:
FROM ubuntu:latest ENV TZ=Europe/London ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y tzdata
必要に応じて、TZ
を設定できます コンテナを起動すると変数になります。これを環境変数としてdocker run
に渡します 。これにより、tzdata
が含まれている場合、画像のデフォルトのタイムゾーンを上書きできます パッケージ。
docker run -e TZ=Europe/London -it ubuntu:latest
環境変数の代わりに、/etc/timezone
を使用します。 ファイル。 Dockerfile
の一部として必要なタイムゾーンを記述できます 。この方法を使用する場合は、tzdata
を再構成する必要があります パッケージマネージャーを使用します。非対話型モードを使用することを忘れないでください。そうしないと、グラフィカルなタイムゾーンプロンプトが再び表示されます。
FROM ubuntu:latest RUN echo "Europe/London" > /etc/timezone RUN dpkg-reconfigure -f noninteractive tzdata
ホストとのタイムゾーンの同期を保証する場合は、ローカルのtzdata
をマウントできます。 ファイルをコンテナに入れます。引き続きtzdata
が必要です これが正しく機能するためのコンテナ内。
docker run -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime -it ubuntu:latest
Dockerはタイムゾーンの組み込みサポートを提供していませんが、それはすべてのコンテナーエンジンに当てはまるわけではありません。 Podmanには専用の--tz
があります 新しいコンテナを作成するときにタイムゾーンを設定できるフラグ:
podman run --tz=Europe/London -it ubuntu:latest
舞台裏では、Podmanは適切な/etc/localtime
をマウントします あなたのためのファイル。指定されたタイムゾーンは、コンテナの存続期間中持続します。
Podmanでは、--tz
なしで作成されたコンテナのデフォルトのタイムゾーンを設定することもできます。 国旗。 .config/containers/containers.conf
を作成または編集します ホームディレクトリにあります。 tz
を追加します ファイルの新しい行の設定:
# Used when no --tz flag is given tz = "Europe/London"
Podmanのネイティブタイムゾーン統合により、Dockerよりも操作が簡単になります。 PodmanのCLIはDockerのCLIと互換性があるため、異なるタイムゾーンのコンテナを頻繁に使用する場合は、切り替えを検討する価値があります。
Dockerコンテナーをセットアップするときに、タイムゾーンが見落とされることがよくあります。ほとんどのベースイメージはデフォルトでUTC時間に設定されているため、ホストのタイムゾーンが異なると混乱する可能性があります。
tzdata
をインストールする パッケージの場合、コンテナはTZ
を介してすべてのタイムゾーンとの互換性を獲得します 環境変数、/etc/timezone
、および/etc/localtime
。または、関連するファイルをコンテナにマウントして、ホストのタイムゾーンを同期することもできます。
最後に、これらの考慮事項は、ホストされているDockerサービスとKubernetesクラスターにも当てはまることに注意してください。特に指示がない限り、コンテナはUTC時間を使用します。環境変数を設定できる限り、TZ
を使用できます。 ワークロードのタイムゾーンを調整します。