🐻

【OS 14種類】Docker imageごとのタイムゾーン設定方法まとめ

2022/01/28に公開約4,100字

Dockerでコンテナを立ち上げるとき、dateコマンド等で使われるタイムゾーンを設定する方法をまとめました。

ホストのタイムゾーンは関係ない

Dockerコンテナの場合はホストのタイムゾーンに関係なく、コンテナ内のOSによって挙動が変わります。

# ホスト側(JST)でdateコマンド実行
$ date
2022年  1月 26日 水曜日 11:05:11 JST

# コンテナを立ち上げてdateコマンドを実行
$ docker run alpine date
Wed Jan 26 02:05:20 UTC 2022

Dockerコンテナのタイムゾーンの設定方法

基本的には2種類の方法があります。

  • タイムゾーンの設定方法(JSTにする場合)
    • 起動時に環境変数TZ=Asia/Tokyoを設定する
    • ホストにある/usr/share/zoneinfo/Asia/Tokyoでコンテナ内の/etc/localtimeを上書き

環境変数を設定する方法が簡単ですが、使用するimageのOSによっては機能しないことがあるので注意が必要です。

alpineの場合

alpineの場合/etc/localtime/usr/share/zoneinfo/も存在していないため、素のalpineでは環境変数でTZを渡してもタイムゾーンはUTCのままです。
ホストにある/usr/share/zoneinfo/Asia/Tokyoをコンテナの/etc/localtimeにコピーかマウントしてあげるとタイムゾーンを変えることができます。

$ docker run alpine date
Wed Jan 26 02:05:20 UTC 2022
$ docker run -e TZ=Asia/Tokyo alpine date
Thu Jan 27 03:22:41 UTC 2022
$ docker run -v /usr/share/zoneinfo/Asia/Tokyo:/etc/localtime alpine date
Thu Jan 27 12:53:00 JST 2022

debianの場合

stretch/buster/jessie/bullseye等の名前がつくimageはdebianをベースに作られています。
環境変数でTZを渡すとタイムゾーンを変更でき、ホストにある/usr/share/zoneinfo/Asia/Tokyoをコンテナの/etc/localtimeにコピーかマウントしてあげても変更できます。

$ docker run debian date
Thu Jan 27 03:20:50 UTC 2022
$ docker run -e TZ=Asia/Tokyo debian date
Thu Jan 27 12:22:10 JST 2022
$ docker run -v /usr/share/zoneinfo/Asia/Tokyo:/etc/localtime debian date
Thu Jan 27 12:55:20 JST 2022

OSごとの挙動の違い

Docker Hub上のofficialイメージでcategory=os、architecture=x86-64(amd64)のイメージを対象に環境変数設定する方法とlocaletimeを上書きをする方法での挙動を調べました。

対象: official・OS・x86-64のイメージ(2022/01/28時点)

各方法ごとのdateコマンド実行結果

OS デフォルト 環境変数設定 localetime上書き
alpine Thu Jan 27 06:23:48 UTC 2022 Thu Jan 27 06:23:49 UTC 2022 Thu Jan 27 15:23:50 JST 2022
debian Thu Jan 27 06:23:51 UTC 2022 Thu Jan 27 15:23:52 JST 2022 Thu Jan 27 15:23:53 JST 2022
ubuntu Thu Jan 27 06:23:54 UTC 2022 Thu Jan 27 06:23:55 Asia 2022 Thu Jan 27 15:23:56 JST 2022
amazonlinux Thu Jan 27 06:23:57 UTC 2022 Thu Jan 27 15:23:58 JST 2022 Thu Jan 27 15:23:59 JST 2022
fedora Thu Jan 27 06:24:00 UTC 2022 Thu Jan 27 15:24:01 JST 2022 Thu Jan 27 15:24:02 JST 2022
oraclelinux Thu Jan 27 06:24:03 UTC 2022 Thu Jan 27 15:24:04 JST 2022 Thu Jan 27 15:24:05 JST 2022
ros Thu Jan 27 06:24:07 UTC 2022 Thu Jan 27 15:24:08 JST 2022 Thu Jan 27 15:24:09 JST 2022
photon Thu Jan 27 06:24:10 UTC 2022 Thu Jan 27 06:24:11 Asia 2022 Thu Jan 27 15:24:12 JST 2022
clearlinux Thu Jan 27 06:24:13 UTC 2022 Thu Jan 27 06:24:14 Asia 2022 Thu Jan 27 15:24:15 JST 2022
mageia Thu Jan 27 06:24:16 UTC 2022 Thu Jan 27 15:24:17 JST 2022 Thu Jan 27 15:24:18 JST 2022
sourcemage Thu Jan 27 06:24:19 UTC 2022 Thu Jan 27 15:24:21 JST 2022 Thu Jan 27 15:24:22 JST 2022
crux Thu Jan 27 06:24:23 UTC 2022 Thu Jan 27 15:24:24 JST 2022 Thu Jan 27 15:24:25 JST 2022
cirros Thu Jan 27 06:24:26 UTC 2022 Thu Jan 27 06:24:27 UTC 2022 Thu Jan 27 06:24:28 UTC 2022
centos Thu Jan 27 06:24:29 UTC 2022 Thu Jan 27 15:24:30 JST 2022 Thu Jan 27 15:24:31 JST 2022

環境変数設定の場合、タイムゾーンがAsiaとなってしまっているものがありますが、時刻を見るとUTCのままでタイムゾーンの変更に失敗していることがわかります。

各方法でのタイムゾーン変更の可否

上記結果をまとめると以下のようにまります。

OS 環境変数設定 localetime上書き
alpine ×
debian
ubuntu ×
amazonlinux
fedora
oraclelinux
ros
photon ×
clearlinux ×
mageia
sourcemage
crux
cirros × ×
centos

cirrosのみlocaletime上書きの方法でもタイムゾーンを変更できませんでしたが、テスト用のイメージなので実際に困る場面はないのかと思われます。

CirrOS は、OpenStack Compute のようなクラウドでテストイメージとして使用するために設計された、最小の Linux ディストリビューションです。 CirrOS ダウンロードページ から CirrOS をさまざまな形式でダウンロードできます。
https://docs.openstack.org/ja/image-guide/obtain-images.html

まとめ

Dockerコンテナのタイムゾーンを変更する場合、localetimeを上書きする方法であれば確実です。しかしKubernetesなどで動かす際にコンテナ内のファイルを上書きする方法は不都合な場合もあります。その場合には、使用しているイメージがどのOSかを確認して環境変数を設定する方法が使えるかを確認しましょう。

GitHubで編集を提案

Discussion

ログインするとコメントできます