はじめに
この記事では、Dockerfile でタイムゾーンが設定された MySQL イメージをビルドする手順について記載します。
Dockerfile の ENV
インストラクションへの理解促進の一環で行っています。
開発環境
開発環境は以下の通りです。
- Windows 11
- Docker Engine 26.1.1
- MySQL 8.4.0
ベースイメージのタイムゾーンの確認
今回のベースイメージは、2024年6月時点で latest タグと同等の 8.4.0
にします。
8.4.0
の MySQL イメージからコンテナを起動し、現在時刻を確認します。
まずはコンテナを起動します。
docker container run `
--name db `
--rm `
--detach `
--env MYSQL_ROOT_PASSWORD=password `
--publish 3306:3306 `
mysql:8.4.0
コンテナ起動時のコマンド・オプションについては、こちらの記事で解説しています。
次に MySQL へ接続し、現在時刻を確認します。
mysql --host=127.0.0.1 --port=3306 --user=root --password=password
select now();
コンテナでは、2024年6月23日1時3分であることがわかります。上記コマンド実行時の日本時間は、2024年6月23日10時3分なので、日本時間と9時間ずれています。
続いて MySQL サーバーのタイムゾーン設定を確認します。
show variables like '%time_zone%';
system_time_zone
では、MySQL サーバー起動時のシステムタイムゾーンが UTC であることを示しています。
また、time_zone
では、MySQL サーバーのタイムゾーンがシステムタイムゾーンと同じことを示しています。
システムタイムゾーンの設定は、環境変数 TZ
で設定できます。そのため、次はコンテナの環境変数を確認します。
docker container exec db printenv TZ
上記コマンドを実行しても何も出力されません。そのため、環境変数 TZ
は設定されていないことがわかります。
ここまでの確認結果から以下のことがわかります。
- コンテナのシステムタイムゾーンが UTC
- システムタイムゾーンの設定を行う環境変数 TZ は未設定
- MySQL サーバーのタイムゾーンはシステムタイムゾーンと同じ
したがって、MySQL にタイムゾーンを設定するためには、環境変数 TZ の値を日本時間にする必要があります。
なお、ベースイメージのタイムゾーンの確認ができたので、db コンテナを停止します。
docker container stop db
イメージの環境変数を指定する ENV
イメージの環境変数の設定は、ENV
インストラクションで行います。
環境変数 TZ の値を日本時間にするための値は、Asisa/Tokyo
です。
FROM mysql:8.4.0
# ENV <key>=<value> ...
ENV TZ=Asia/Tokyo
上記 Dockerfile からイメージをビルドします。
docker image build --tag my-mysql:tokyo .
my-mysql:tokyo
がビルドされたことを確認します。
docker image ls my-mysql
次はビルドしたイメージからコンテナを起動します。
docker container run `
--name db `
--rm `
--detach `
--env MYSQL_ROOT_PASSWORD=password `
--publish 3306:3306 `
my-mysql:tokyo
MySQL へ接続し、現在時刻を確認します。
mysql --host=127.0.0.1 --port=3306 --user=root --password=password
select now();
コンテナの時間が日本時間と同じ、2024年6月23日10時56分であることがわかります。
続いて MySQL サーバーのタイムゾーン設定を確認します。
show variables like '%time_zone%';
システムタイムゾーンが JST
になっています。
次はコンテナの環境変数を確認します。
docker container exec db printenv TZ
今回は実行結果が出力され、Asia/Tokyo
になっています。
参考
関連記事