さまざまな構成値を定義する必要がある場合は、環境変数が最適です。多くのツールと同様に、Docker、より具体的には、Docker Composeは環境変数を定義および読み取り、構成をクリーンでモジュール式に保つのに役立ちます。このチュートリアルでは、docker-compose
の使用方法を説明します。 さまざまなコンテナ、環境などを定義するための環境変数。
前提条件
ステップバイステップでフォローしたい場合は、次のものがあることを確認してください。
- 管理者権限を持つLinuxホスト。このチュートリアルでは、Ubuntu18.04.5LTSを使用します。
- LinuxホストにインストールされたDocker。このチュートリアルでは、Dockerv19.03.11を使用します。
Docker作成ファイルでの環境変数の宣言
コンテナは多くの構成を要求する可能性があります。また、コンテナ内のすべての構成が一意になるわけではありません。 MySQLデータベースのクレデンシャルなど、一部の設定は一部のコンテナ間で共有される場合があります。クレデンシャルを各コンテナに手動で保存します。クレデンシャルが変更されると、クレデンシャルを複数回更新する必要があります。
環境変数はその面倒を減らすことができます。それらの共有設定を環境変数として保存してください!コンテナ内で繰り返すのではなく、環境変数を参照してください。クレデンシャルが変更された場合は、環境変数という1つの設定のみを更新する必要があります。
まず、環境変数を宣言し、それをDockerComposeファイル自体に保存します。以下の手順では、仮想のMySQLデータベースの設定を環境変数に保存します。
1.ローカルマシンでターミナルを開きます。
2.〜/ docker-compose-demo、という名前のフォルダを作成します 次に変更します(cd
)作成したフォルダへの作業ディレクトリ。 〜/ docker-compose-demo フォルダには、このチュートリアルで作成するすべてのファイルが含まれます。
mkdir ~/docker-compose-demo
cd ~/docker-compose-demo
3.お気に入りのテキストエディタを開き、テキストエディタで以下のスニペットのコードをコピーして貼り付けます。ファイルをdocker-compose.ymlとして保存します 〜/ docker-compose-demo内 ディレクトリ。 docker-compose.yml アプリケーションのサービスの構成を保存します。
以下のスニペットコード:
-
mysql:5.7
DockerComposeがプルして新しいコンテナを作成するベースイメージです。 -
MYSQL_ROOT_PASSWORD
、MYSQL_ALLOW_EMPTY_PASSWORD
、およびMYSQL_RANDOM_ROOT_PASSWORD
DockerComposeファイル内の3つの異なる環境変数です。各環境変数は、その値で宣言されます。環境変数が取得する値は、:
の後にあります シンボル。 -
mysql
サービスはmysql
という名前のコンテナを作成します 。
# Version of Docker compose file
version: "2.2"
services:
# Defining the service
mysql:
# Defining the base image to be used
image: mysql:5.7
hostname: mysql
container_name: mysql
# Defining the environmental variable
environment:
# ENVIRONMET_VARIABLE_NAME: "environment variable value"
MYSQL_ROOT_PASSWORD: "root_password"
MYSQL_ALLOW_EMPTY_PASSWORD: "password"
MYSQL_RANDOM_ROOT_PASSWORD: "password"
一部のコンテナは、適切に機能するために環境変数に依存しています。例のMySQLは、これらのコンテナの1つです。コンテナが期待する環境変数を宣言しないと、エラーがスローされます。以下のエラーを確認できます。
4.次に、docker-compose up
を実行します 指図。 docker-compose up
コマンドはYAMLファイル( docker-compose.yml )前の手順で作成し、コンテナを作成します。 docker-compose up
コマンドは、DockerComposeファイルで構成されているすべてのサービスを開始します。
5.ここで、docker exec
を実行して、3つの環境変数すべてがコンテナーに存在するかどうかを確認します。 コマンドとenv
指図。
docker execコマンドを実行すると、コンテナーにログインできるようになります。 env
を実行しています 現在の環境変数のリストとそれぞれの値を出力します。
# ee8a... is the container
docker exec -it ee8af8bfcd41 /bin/bash
環境変数の置換
前のセクションでは、環境変数をハードコーディングしてDockerComposeファイル内で直接宣言する方法を学習しました。資格情報を保護する必要がある場合、このようなアプローチは最適ではありません。別の方法として、環境変数の値を .envという名前のファイルに保存します。 管理者だけが読むことができます。
環境変数の代わりに使用する練習をしましょう。ターミナル内:
1. .envという名前のファイルを作成します 同じ〜/ docker-compose-demo ディレクトリを作成し、以下のコードを .envにコピーします。 ファイル。ファイルには、すべての環境変数とそれぞれの値が含まれます。
# Defining the values of environmental variables
MYSQL_ROOT_PASSWORD="root_password"
MYSQL_ALLOW_EMPTY_PASSWORD="password"
MYSQL_RANDOM_ROOT_PASSWORD="password"
2.次に、 .envの権限を編集します setfaclコマンドを使用して前のステップで作成したファイル。以下のコマンドは、rootユーザーが .envへの読み取り/書き込み権限を持っていることを確認します。 ファイル。
-
m
パラメータを使用すると、ファイル/フォルダへのアクセス許可を設定できます。 -
u
ユーザーです(root
)指定されたファイル~/*docker-compose-demo/.env
に権限が付与されます
setfacl -m "u:root:rw" ~/docker-compose-demo/.env
3.次に、docker-compose.ymlファイルを編集して開きます お気に入りのエディターを使用して、 docker-compose.ymlの環境セクションをコメントアウトします。 前のセクションから。以下のコードを追加して、作成ファイルの環境変数のデフォルト値を設定します。
Dockerは、コマンドラインを介して、または .envなどのファイルを読み取ることによって値を設定します 例のファイル。いずれの場合も、Dockerはそれに応じて値を置き換えます。
# Defining the environmental variable using Hardcoded values in variables
environment:
### Static way ###
# MYSQL_ROOT_PASSWORD: "root_password"
# MYSQL_ALLOW_EMPTY_PASSWORD: "password"
# MYSQL_RANDOM_ROOT_PASSWORD: "password"
### Substitution ###
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_ALLOW_EMPTY_PASSWORD: ${MYSQL_ALLOW_EMPTY_PASSWORD}
MYSQL_RANDOM_ROOT_PASSWORD: ${MYSQL_RANDOM_ROOT_PASSWORD}
コードは、文字列補間メソッドを適用して変数を定義します。文字列補間を使用する変数は、${variable}として宣言されます。 Dockerは、実行時に環境変数の値を設定します。
4.もう一度、docker-compose up
を実行します 指図。 docker-compose up
を実行すると コマンド、 docker-compose.yml ファイルは、 .envで環境変数の値を検索します ファイル。 docker-compose
コマンドは自動的に.envを探します プロジェクトディレクトリまたは作成ファイルの親フォルダにあるファイル。
docker-compose
とすぐに docker-compose.ymlで設定された環境変数の値を検索します .env内 ファイル、Composeはそれに応じて値を置き換え、サービスを開始します。サービスを開始すると、 docker-compose.ymlで定義されたコンテナが作成されます ファイル。
複数の環境に複数の環境変数ファイルを使用する
これまで、環境変数を宣言するための2つのアプローチを学びました。 1つ目は、 docker-compose.yml内で環境変数を宣言することです。 ファイル。 2番目のアプローチは、単一の。 env内で環境変数を宣言することです。 ファイルと置換の適用。
どちらのアプローチも、単一の環境で作業する場合に適しています。本番環境やテスト環境など、複数の環境がある場合は、別のアプローチが必要です。複数の.envを作成する方法を確認しましょう 環境に合わせて異なる名前のファイル!
以下の例は、IT Opsで遭遇する可能性のある通常の環境(Dev、QA、およびProd)をエミュレートします。ターミナルに戻る:
1. 〜/ docker-compose-demoに移動します ディレクトリを作成し、。 env.devを作成します ファイル。以下のスニペットコードの内容をコピーしてファイルに貼り付け、保存します。このファイルには、MySQL開発環境データベースで使用される設定が保持されます。
# Enviornmental Variables file .env.dev
MYSQL_ROOT_PASSWORD="password_DEV"
MYSQL_ALLOW_EMPTY_PASSWORD="password1"
MYSQL_RANDOM_ROOT_PASSWORD="password1"
2.同じディレクトリに、 .env.qaを作成します ファイルを作成し、以下のスニペットコードの内容をファイルに保存します。これらは、MySQL品質保証環境データベースの設定です。
# Enviornmental Variables file .env.qa
MYSQL_ROOT_PASSWORD="password_QA"
MYSQL_ALLOW_EMPTY_PASSWORD="password2"
MYSQL_RANDOM_ROOT_PASSWORD="password2"
3.ここで。env.prodを作成します 架空のMySQL実稼働環境データベースの設定を保存するファイル。内容は以下のとおりです。
# Enviornmental Variables file .env.prod
MYSQL_ROOT_PASSWORD="password_PROD"
MYSQL_ALLOW_EMPTY_PASSWORD="password3"
MYSQL_RANDOM_ROOT_PASSWORD="password3"
4.次に、docker-compose
を実行します --env-file
を使用したコマンド オプション、 .env.devを指定します ファイル。 docker-compose
コマンドは.env.devを検索します 現在の〜/ docker-compose-demoのファイル ディレクトリ。
docker-compose --env-file .env.dev up
ファイルを引数として渡すと、ファイルをどこにでも適切な名前で保存できます。
以下に示すように、 .env.dev を置き換えることで、さまざまな環境ファイルを簡単に選択して展開できます。 .env.qaのいずれかにファイルします または.env.prod ファイル。
# Running the docker-compose command with the QA file
docker-compose --env-file .env.qa up
# Running the docker-compose command with the Prod file
docker-compose --env-file .env.prod up
5.ここで、構成ファイル( .env.dev )docker exec
を実行して正常に読み取られました 指図。 docker execコマンドを実行すると、コンテナーにログインできるようになります。 env
を実行しています 現在の環境変数のリストを出力します。
3つの環境変数(MYSQL_ROOT_PASSWORD
)すべてに注意してください。 、MYSQL_ALLOW_EMPTY_PASSWORD
、およびMYSQL_RANDOM_ROOT_PASSWORD
)コンテナに存在します。それらの値はenv.devからのものであることに注意してください ファイル。
env_file
を組み込む DockerComposeファイル内
前のセクションでは、。 envで環境変数を宣言する方法を説明しました。 ファイル。環境変数の値を。envに保存する場合 個別にファイルを作成すると、 docker-compose.ymlに多くの行と参照が含まれることになります。 。
docker-compose.ymlの環境変数の参照と行数を減らすため ファイルの場合は、env_fileを docker-compose.ymlに組み込むことを検討してください。 ファイル。
env_file
を組み込む方法を学びましょう Docker構成ファイル内。もう一度、ターミナルで:
1. var.envという名前のファイルを作成します MySQLデータベースの設定を保持します。以下をコピーしてvar.envに貼り付けます ファイルを作成して同じ〜/ docker-compose-demoに保存します ディレクトリ。
MYSQL_ROOT_PASSWORD="password_NEW"
MYSQL_ALLOW_EMPTY_PASSWORD="password_NEW"
MYSQL_RANDOM_ROOT_PASSWORD="password_NEW"
2.次に、以前に作成したdocker-compose.ymlファイルを開きます お気に入りのエディターを使用します。 docker-compose.ymlの環境セクションを置き換えます 以前にenv_file
で作成したもの 、ファイルのパスを- ./var.env
で追加します 。
Dockerは./var.envを検索します 同じ〜/ docker-compose-demo内のファイル ディレクトリ。
version: "2.2"
services:
mysql_svc:
image: mysql:5.7
hostname: mysql
container_name: mysql
# Replacing the environment: with env_file:
# environment:
# MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
# MYSQL_ALLOW_EMPTY_PASSWORD: ${MYSQL_ALLOW_EMPTY_PASSWORD}
# MYSQL_RANDOM_ROOT_PASSWORD: ${MYSQL_RANDOM_ROOT_PASSWORD}
env_file:
- ./var.env
3つの設定と参照がすべてなくなっていることに注意してください。参照は1つだけです。例ではあまり見えないかもしれません。しかし、現実の世界では、参照の数がすぐに手に負えなくなる可能性があります。
3.次に、docker-compose
を実行します 指図。このコマンドは、 var.envに存在する環境変数の値を検索します。 ファイルを作成し、 docker-compose.ymlで定義したコンテナを作成します ファイル。
Dockerはサービスを作成します。つまり、Dockerは var.envで環境変数の値を見つけました。 ファイル。確認するには、docker exec
を実行します およびenv
最後にもう一度コマンドします。すべての環境変数(MYSQL_ROOT_PASSWORD
が表示されます 、MYSQL_ALLOW_EMPTY_PASSWORD
、およびMYSQL_RANDOM_ROOT_PASSWORD
)とコンテナ内のそれらの値。
結論
このチュートリアルでは、Dockercomposeを使用して環境変数を宣言するさまざまな方法を学びました。この記事では、Dockerが環境変数を直接コーディングするか、別々のファイルで使用することにより、環境変数を宣言する際に非常に柔軟に対応できることを示しました。
では、Docker ComposeからDockerコンテナを実行するときに、次に使用するアプローチはどれですか?