Docker でタイムゾーンの問題に対処する方法

Docker でタイムゾーンの問題に対処する方法

背景

ここ 2 日間 Docker を使用していたところ、コンテナの起動後に date -R の出力タイムゾーンが UTC になり、北京時間より常に 8 時間遅れていることに気付きました。


標準画像


タイムゾーンはUTCです

/etc/localtime を確認すると、デフォルトのタイムゾーンは Etc/UTC であることがわかりました。また、TZ 環境変数は設定されていません。


Linux でタイムゾーンの問題に対処する方法

実際、タイム ゾーン処理の問題はすべて、glibc でのタイム ゾーン処理の問題です。この問題に関する最も権威のあるドキュメントは、TZ 環境変数について説明し、タイム ゾーンの問題の処理を紹介する公式の glibc ドキュメントです。

https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html#TZ-Variable

弊社に関係する部分は以下の通りです。

基本的な意味は次のとおりです。glibc では、TZ 環境変数の値は、タイムゾーン関連の情報を記述したファイルの名前です。

TZ 環境変数が設定されていない場合、システムはデフォルト値を選択します。glibc では、デフォルト値は /etc/localtime です。TZ 環境変数に値があり、その値が / で始まる場合、それは絶対パスのファイル名です。それ以外の場合、ファイル名は /usr/share/zoneinfo/$TZ です。/usr/share/zoneinfo ディレクトリには、Asia/Shanghai など、世界のさまざまな地域のローカル時間情報が含まれています。通常、このディレクトリ内のファイルは tzdata パッケージによってインストールされます。

この考えに従って、TZ環境変数をAsia/Shanghaiに強制すると、タイムゾーンは正しいものになります。


/etc/localtime ファイルを強制的に変更し、タイムゾーンも正しくなります。

Dockerコンテナでタイムゾーンを処理する方法

上記の説明によると、Docker コンテナでタイムゾーンを設定するには、実際には主に 2 つの方法があります。1 つは TZ 環境変数を直接設定する方法で、もう 1 つは TZ 環境変数を設定せずに /etc/localtime の内容を直接変更する方法です (ソフト リンク経由またはファイルを直接コピーする方法)。

ここでは、TZ 環境変数の設定を例に挙げます (私はこれを自分で行うことを好みます。/etc/localtime を変更するよりも便利だと感じます)。

まず、Dockerfile に ENV TZ=Asia/Shanghai を追加して、Docker によって構築されたイメージのデフォルトの TZ 環境変数が必要な値になるようにします。


次に、コンテナをプルアップするときに、-e TZ=Asia/Shanghai を使用して TZ 環境変数を設定することもできます。この設定は動的です。プルアップするときに、同じイメージに異なる値を設定できます。


要約する

docker でのタイムゾーン処理は、実際には glibc でのタイムゾーン処理です。glibc の処理方法を理解すると、その中心となるのは TZ 環境変数と /etc/localtime ファイルであり、docker でのタイムゾーン処理は簡単です。

以下もご興味があるかもしれません:
  • Docker のタイムゾーンの問題とデータ移行の問題
  • Dockerコンテナのタイムゾーン調整操作
  • 作成されたDockerコンテナの時刻表示エラー/日付エラー/タイムゾーンエラー
  • docker タイムゾーンの変更と一般的な docker コマンドの詳細な説明
  • Dockerコンテナのタイムゾーンと時刻同期の問題を解決する方法
  • Docker イメージを作成してコンテナを起動する 2 つの方法の違い (要約)
  • Docker コンテナのタイムゾーン エラーの問題

<<:  InnoDB がトランザクション分離レベルを巧みに実装する方法

>>:  WeChatアプレットはキャンバスを使用して時計を描画します

推薦する

MySQLの左結合と内部結合について簡単に説明します

序文最近、X 省のコールド チェーン トレーサビリティ システムの開発で忙しくしています。毎日午後 ...

MySQL8 ベースの docker-compose デプロイメント プロジェクトの実装

1. まず、次のパスに従って対応するフォルダを作成します。 ローカルのdockerでmysqlを実行...

nginx を使用して http を https に変換するサンプルコード

最近、小さなプログラムを書いています。その小さなプログラムの公式ウェブサイトはhttpsを使用する必...

テキストの展開と折りたたみの効果を実現するJavaScript

リスト形式のテキストの展開と折りたたみの実装は参考までに。具体的な内容は以下のとおりです。必要: 1...

VMware15/16 VMwareのロックを解除してMacOSをインストールする詳細な手順

VMware バージョン: VMware-workstation-full-16 VMware バー...

独自の Docker イメージを作成して Dockerhub にアップロードする方法

1. まず、自分のdockerhubアカウントを登録します。登録アドレス: https://hub....

検索データ表示を実装するJavaScript

この記事ではJavaScript検索のデータ表示コードを参考までに共有します。具体的な内容は以下のと...

MySQLビューの原理と使用法の詳細な説明

この記事では、例を使用して MySQL ビューの原理と使用方法を説明します。ご参考までに、詳細は以下...

jQueryはスライディングタブを実装する

この記事では、スライドタブを実装するためのjQueryの具体的なコードを参考までに紹介します。具体的...

Docker を使用して ELK ログ システムを構築する例

以下のインストールではすべて、インストール ルート ディレクトリとして ~/ ディレクトリが使用され...

CSS の境界線を通して三角形と矢印を実装するサンプルコード

1. CSS ボックスモデルボックスには、余白、境界線、パディング、コンテンツが含まれます境界線の接...

MySQL ビューの一貫性を確保する方法の詳細な説明 (チェック オプション付き)

この記事では、例を使用して、MySQL ビューの一貫性を確保する方法 (チェック オプションを使用)...

Tomcat8はcronologを使用してCatalina.Outログを分割します

背景tomcat によって生成された catalina.out ログ ファイルが分割されていない場合...

MySQLの整数および文字列インデックスの無効化または暗黙的な変換に関する簡単な説明

目次問題の概要問題の再現問題の拡大結論は問題の概要今日、仕事中に、DBA が突然、SQL に暗黙的な...

JSはプログレスバーをドラッグして要素の透明度を変更することを実装しています

今日ご紹介したいのは、ネイティブ JS を使用してプログレス バーをドラッグし、要素の透明度を変更す...