Dockerコンテナにおける.envを用いた環境変数のセットアップ

2023/09/12に公開

はじめに

この記事では、.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