Dockerの設定で意外とめんどくさいのが、システムのタイムゾーンです。

何も意識しないで、Dockerのコンテナを作るとタイムゾーンは、UTC(世界標準時刻)になります。

UTCとJTCのずれは9時間なので、気にしない・・という方がいるかもしれませんが、複数時刻の混在は後からの混乱の元です。

上級者なら、envファイルを設定するなど、色々やり方はありますが、初心者でも簡単に変更できる方法をいくつかご紹介です。

 

コンテナの中に入って直接タイムゾーンを変更する

既存の稼働しているコンテナの中に直接入る方法です。

$ docker exec -it -u root <コンテナID> bash

-u rootの記述は、既存ユーザーで次のエラー”sudo: command not found”が出てしまった場合、挿入してください。

そもそもsudoが効かない場合、apt updateを実行してから、apt install sudoでインストールできます。

timedatectlを使用する方法

$ sudo timedatectl set-timezone Asia/Tokyo

通常は、これで日本時間にタイムゾーンを変更できますが、”bash: sudo: command not found”と表示されてしまう場合もあります。

こんな時は、設定ファイルを変更しましょう。

localtimeのタイムゾーンを変更する方法

$ ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

これで、即座にタイムゾーンが変更になります。

dateコマンドで確認してみましょう。

# date
Sun Mar 27 13:26:26 JST 2022

以上2つの方法で、タイムゾーンを日本時間に変更できます。

ただし、VPSの再起動やimageからコンテナが作られた時は、初期状態に戻ってしまいます。

docker-composeのstopで停止してからのstartなら、タイムゾーンの変更は維持されますが、downでは完全にリセットされます。

よって、タイムゾーンの変更をシステム側に永久的に残しておくなどの対策が必要になりますが、お手軽で簡単なのはDockerfileの中に記述する方法です。

Dockerfileの中にタイムゾーン変更を記述する方法

Dockerfileの中に次のコマンドを追加します。

RUN apt-get install -y tzdata && \ 
    ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

1度buildしてから、runで作られたコンテナを実行すれば、日本時間に変更されます。

docker-compose.ymlを使うならもっと簡単です。

docker-compose.ymlの記述でタイムゾーンを日本時間にする

environmentの中にTZを指定して、Asia/Tokyoを記述するだけです。

次のような感じでTZ環境変数を使うのが便利です。

version: '3.5'
    services:
              serposcope_web:
                  environment:
                      TZ: Asia/Tokyo

その他、ホストにマウントする方法やバインドする方法もありますが、色々弊害も発生する可能性もあるので、ご紹介していません。