概要
Docker Composeのdocker-compose.yml
内に設定値を直接書き込むのではなく別ファイルで環境変数を定義し、その定義した値を使用してコンテナを作成します。
先日、Docker Composeを使用したPHPの環境構築の流れでMySQLを使用したDBサーバ(コンテナ?)を作成しました。
MySQLの初期スキーマ・ユーザ/パスワード・rootパスワードをdocker-compose.yml
に直書きがなんかな〜と思った次第です。
極論、ここ読めです。
目次
参考サイト様
- Compose file version 3 reference | Docker Documentation 🔗
- Environment variables in Compose | Docker Documentation 🔗
- Docker-Compose の変数定義について - Qiita 🔗
成果物
https://github.com/Lycheejam/php-crud-sample 🔗
docker-compose.yml
で環境変数を使う
docker-compose.yml
内で環境変数の値を使用する方法は複数用意されています。
今回は、.env
ファイルを作成し環境変数を定義(設定?)します。
その値をdocker-compose.yml
ファイル内で使用する流れです。
今回はDocker ComposeでMySQLのコンテナを作成する際にenvironment
セクションで環境変数を使用する想定で進めます。
注意事項
今回、使用する環境変数を.env
ファイルで設定方法はdocker-compose up
コマンドでのみ機能します。
下記の公式ドキュメントに記載がありました。引用します。
The .env file feature only works when you use the docker-compose up command and does not work with docker stack deploy.
Compose file version 3 reference #Variable substitution | Docker Documentation 🔗
Google翻訳より
.envファイル機能は、docker-compose upコマンドを使用した場合にのみ機能し、docker stack deployでは機能しません。
個人の練習環境で使っているので実用に耐えうるかはわかりません。
docker-compose.yml
で環境変数を使用するための構文
ファイルまたはexport
されている環境変数をdokcer-compose.yml
で展開するための構文です。
公式ドキュメントは以下の2つが該当します。
- 参考:Compose file version 3 reference #Variable substitution | Docker Documentation 🔗
- 参考:Environment variables in Compose | Docker Documentation 🔗
${}
で定義した環境変数を記述することで値が使用可能になります。
${hoge}
.env
ファイルの作成
プロジェクトルートに.env
ファイルを作成します。
docker-compose up
をした際に勝手にこのファイルを探して読み込んでくれるみたいです。
.env
USERNAME=sampleuser
USERPASS=password
DATABASE=SAMPLEDB
ROOTPASS=password
それぞれ、docker-compose.yml
でMySQLコンテナを定義する際に使用する環境変数です。
docker-compose.yml
の編集
先程の.env
ファイルを使用するためにdocker-compose.yml
を編集します。
- 編集前:
docker-compose.yml
version: "3.7"
services:
# 省略
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: SAMPLEDB
MYSQL_USER: sampleuser
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: password
# 省略
- 編集後:
docker-compose.yml
version: "3.7"
services:
# 省略
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: ${DATABASE}
MYSQL_USER: ${USERNAME}
MYSQL_PASSWORD: ${USERPASS}
MYSQL_ROOT_PASSWORD: ${ROOTPASS}
# 省略
ただ、単純に環境変数を使用するための構文を使って.env
ファイルで定義した変数名を記述しています。
docker-compose.yml
で使用した環境変数の値を確認する
環境変数の値が展開された後のdocker-compose.yml
を確認します。
docker-compose
コマンドのconfig
オプションを使うことで変数の値が展開されたあとのdocker-compose.yml
を確認可能です。
$ docker-compose config
services:
db:
environment:
MYSQL_DATABASE: SAMPLEDB
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: sampleuser
image: mysql:5.7
# 省略
以上で完了です。
他にもいろいろやる方法があるので試したらブログにします。
雑感
多分、本番/ステージングで切り替えたりする感じで使うんですよね。
実務でDocker使ったことないから知らんけど。