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 バッチ SQL 挿入パフォーマンス最適化の詳細な説明

大量のデータを扱うシステムの中には、クエリ効率の低さやデータの保存時間の長さといったデータベースの問...

Linux システム (CentOS7 インストール) に JDK8 をインストールするための詳細なチュートリアル

JDKのインストールシステムのインストールについてはあまり詳しく説明しません。インストール手順はオン...

Nginx の負荷分散と動的および静的分離の原理と構成

目次1. Nginxは負荷分散の原則を実装する2. Nginxの動的および静的分離の原則Nginx ...

React Fiberの仕組みの詳細な説明

目次React Fiberとは何ですか?なぜReact Fiberなのか? React Fiberは...

ネイティブJSが様々なスポーツの均一な動きを実現

この記事では、ネイティブ JS で実装された均一なモーションを紹介します。その効果は次のとおりです。...

VMware Workstation 14 Pro のインストールとアクティベーションのグラフィック チュートリアル

この記事では、VMware Workstation 14 Proのインストールとアクティベーションに...

マーキー要素は、スクロールするフォントや画像などの効果を実装します。

マーキー要素を使用すると、単純なフォント(画像など)のスライドやその他の効果を実現できます。コードを...

Vueモバイル端末の適応化問題の詳細説明

1. vue uiでプロジェクトを作成する 2. 基本設定項目を選択する 3. プロジェクトを実行す...

MySQL INT型の完全な分析

序文: Integer は MySQL で最もよく使用されるフィールド型の 1 つで、通常は整数を格...

ウェブページ内の 2 つのボックス モデル (W3C ボックス モデル、IE ボックス モデル)

Web ページ ボックス モデルには 2 種類あります。 1: 標準 W3C ボックス モデル。2:...

CentOS 7.5 が Varnish キャッシュサーバー機能を導入

1. ワニスの紹介Varnish は、高性能なオープンソースのリバースプロキシサーバーおよび HTT...

HTML における src と href の違いについての簡単な説明

簡単に言うと、srcは「このリソースをロードしたい」という意味で、hrefは「このリソースに関連付け...

MySQL の同時実行性の問題と解決策の分析

目次1. 背景2. テーブルロックによるクエリの遅延3. オンラインでテーブル構造を変更するとどのよ...

MySQL を使用してポート 3306 を開いたり変更したり、Ubuntu/Linux 環境でアクセス許可を開く

オペレーティングシステム: Ubuntu 17.04 64ビットMySQL バージョン: MySQL...

WebWorkerはJavaScriptサンドボックスの詳細をカプセル化します

目次1. シナリオ2. IJavaScriptShadowboxを実装する2.1 メインスレッドの実...