⛳
Dockerコンテナにおける.envを用いた環境変数のセットアップ
はじめに
この記事では、.envファイルを用いてDockerコンテナの環境変数を
セットアップする方法について説明します。
MySQLの接続情報などをDockerfileに直接書き込むのではなく
外部の.envに記載することで、
機密情報を安全に管理し変更も容易にできるようになります。
設定方法
例としてMySQLの接続情報を.envに設定し、その設定をdocker-compose.ymlに
適用する方法を説明します。
.envとdocker-compose.ymlの設定
まず、docker-compose.ymlと同じ階層に.envを作成します。
この.envファイルには、MySQLに接続するための情報を環境変数として定義します。
以下のように環境変数を設定します。
.env
DB_DATABASE=db_test
DB_USER=user
DB_PASSWORD=password
DB_ROOT_PASSWORD=password
次に、docker-compose.ymlに.envで定義した環境変数を
${変数名}
の形式で指定します。
これにより、環境変数がDockerコンテナ内に適切にセットされます。
docker-compose.yml
version: '3.9'
services:
db:
build: ./infra/mysql
ports:
- "4306:3306"
volumes:
- db-store:/var/lib/mysql
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
TZ: "Asia/Tokyo"
これらの設定後、以下のコマンドを実行することで、
.envの環境変数がdocker-compose.ymlに自動で適用されます。
docker-compose up -d
誤った設定例
docker-compose.ymlに環境変数を以下のように
${変数名}
の形式で指定しない場合、文字列そのものが適用されてしまい
期待した動作にならないため注意が必要です。
docker-compose.yml
environment:
MYSQL_DATABASE: DB_DATABASE
MYSQL_USER: DB_USER
MYSQL_PASSWORD: DB_PASSWORD
MYSQL_ROOT_PASSWORD: DB_ROOT_PASSWORD
TZ: "Asia/Tokyo"
この設定でコンテナを起動して環境変数を確認すると、
実際の環境変数の値ではなく、指定した文字列がそのまま適用されてしまいます。
コマンドで確認する例:
docker-compose exec db env
出力内容は以下のようになります。
HOSTNAME=1111aaaabbbb
TERM=xterm
MYSQL_DATABASE=DB_DATABASE
MYSQL_USER=DB_USER
MYSQL_PASSWORD=DB_PASSWORD
MYSQL_ROOT_PASSWORD=DB_ROOT_PASSWORD
TZ=Asia/Tokyo
MYSQL_UNIX_PORT=/var/lib/mysql/mysql.sock
HOME=/root
このような問題を避けるためには、環境変数を${変数名}
の形式で指定する必要があります。
注意点
- .envがdocker-compose.ymlと同じ階層に設置されていない場合、自動で読み込まれない
もし異なる階層に設置したい場合は、--env-file
オプションを使用し
パスを指定してください。
docker-compose --env-file /path/to/your/.env up -d
- .envは機密情報を含む可能性があるため、Gitリポジトリには含めない
.gitignoreファイルに.envを追加して、バージョン管理から除外する必要があります。
Discussion