タイムゾーンは、アプリケーションをコンテナ化する際の一般的な混乱の原因です。 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を使用できます。 ワークロードのタイムゾーンを調整します。