Dockerのdocker-compose.ymlでenv_fileオプションによりMySQLの.envファイルを読み込んで環境変数を設定する方法

DockerでMySQLコンテナのユーザー名やパスワードの設定を、docker-compose.ymlで外部.envファイルを読み込んで行う方法の解説

Dockerのdocker-compose.ymlを使ってMySQLのコンテナを作るときに、同ymlファイルにMySQLの環境変数について設定した「.env」ファイルから情報を読み込ませることができます。

それによって、docker-compose.ymlの自体にパスワードなどの情報を書く必要がなくなり、よりdocker-compose.ymlの使いまわし(共有?)がしやすくなります。今回はその方法を説明します。

やることは難しくありませんが、そのためにはdocker-compose.ymlの「env_file」オプションを使います。ではその使い方を見ていきましょう。

プログラミング言語の人気オンラインコース

docker-compose.ymlの「env_file」オプションの使い方

env_fileとは?

Dockerのdocker-composeには、env_fileというオプションが用意されています。これは、環境変数などの情報を記述した環境設定ファイルを読み込むためのものです。

今回はそのオプションを使って、MySQLの環境変数ファイルの.envを読み込もうというわけです。

詳しくは下のリンクから公式サイトをご覧ください

Docker ドキュメント日本語化プロジェクト:env_file

使い方と使用例

まず次のようなdocker-compose.ymlがあるとします。このサービス名「db」項目中のコメントアウト部分「#☆」部分を見てください。

version: '3'

services:
  django:
    container_name: django_container

  (略)


  db:
    image: mysql:8.2.0

    container_name: mysql-container 


    #☆外部.envファイルで設定した環境変数を利用して環境を設定
    env_file: ../mysql/.env

 

    volumes:
      -  ../mysql/my.cnf:/mysql/conf.d/my.cnf
      -  db_data:/var/lib/mysql
  
volumes:
  db_data:

(略)

この記述の中で、

    #☆外部.envファイルで設定した環境変数を利用して環境を設定
    env_file: ../mysql/.env

としている部分が今回のポイントとなる「env_file」オプションの部分です。

env_file: .envへのパス

という書き方です。

「.envへのパス」については、基本的にdocker-compose.ymlからの相対パスを書くのが基本になると思います。

.devcontainerフォルダ

今回の私のファイル構成は簡単に上画像のようになっているので、docker-compose.ymlから.envへの相対パスは、

../mysql/.env

となっています。

では次にこの.envファイルの中身ですが、それは次のようになっています。


MYSQL_DATABASE: test
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: root
TZ: 'Asia/Tokyo'

便宜上、パスワードやユーザー名はあくまでテキトーにつけただけのものです。

このようにしたうえで、実際にdocker-compose.ymlによってDockerコンテナのビルドを実行します。

実行結果確認と「docker-compose config」コマンド

では実際にきちんとパスワードなどがMySQLコンテナに設定されているか見てみましょう。そのためには、WindowsならコマンドプロンプトやPowerShell、Macならターミナル、Linux系ならシェルを起動させます。

そして使用しているdocker-compose.ymlが存在しているフォルダ(ディレクトリ)へ移動します。

それから次のコマンドを入力します。

docker-compose config

この実行結果ですが、今回の私の場合は、

docker-compose.ymlがあるディレクトリ> docker-compose config
name: docker
services:
  db:
    container_name: mysql-container
    environment:
      MYSQL_DATABASE: test
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: user
      TZ: Asia/Tokyo
    image: mysql:8.2.0
    networks:
      default: null
    volumes:
      - type: bind

このようになり、MYSQL_DATABASEなどの変数が表示され、.envファイルの記述が反映されているのがわかります。

なお、このenv_fileオプションは複数の環境設定ファイルを読み込むことが出来ます。その場合は、

env_file:
  - ../ageage/common.env
  - ./apps/web.env
  - ../src/opt/secrets.env

などのように複数連ねて書くことが可能です。