Docker Compose で環境変数を参照する方法の例

Docker Compose で環境変数を参照する方法の例

プロジェクトでは、さまざまな条件や使用シナリオを制御するために、docker-compose.yml ファイルで環境変数を使用する必要があることがよくあります。この記事では、Docker Compose が環境変数を参照する方法に焦点を当てます。

注: この記事のデモ環境は Ubuntu 16.04 です。

CLIと環境変数を作成する

Compose CLI (compose コマンドライン、つまり docker-compose プログラム) は、COMPOSE_PROJECT_NAME および COMPOSE_FILE という名前の環境変数を認識します (サポートされている特定の環境変数については、こちらを参照してください)。たとえば、次の 2 つの環境変数を使用して、docker-compose のプロジェクト名と構成ファイルを指定できます。

$ エクスポート COMPOSE_PROJECT_NAME=テスト変数
$ エクスポート COMPOSE_FILE=~/projects/composecounter/docker-compose.yml 

次にアプリケーションを起動すると、環境変数で指定したプロジェクト名が表示されます。

環境変数を設定し、同時にコマンドライン オプションを指定すると、コマンドライン オプションの設定が適用されます。

$ docker-compose -p ニックネームプロジェクトアップ -d 

Compose ファイルで環境変数を参照する

次のデモのように、Compose ファイルで環境変数を直接参照することもできます。

バージョン: '3'
 サービス:
 ウェブ:
  画像: ${IMAGETAG}
  ポート:
  - 「5000:5000」
 レディス:
  画像: "redis:alpine"

環境変数 ${IMAGETAG} を通じて Web イメージを指定します。次に、エクスポートを通じて Compose 構成ファイルの環境変数の値を渡します。

対応する環境変数が設定されていない場合、compose はそれを空の文字列に置き換えることに注意してください。

この場合、Compose 構成ファイルで変数のデフォルト値を設定できます。

バージョン: '3'
サービス:
 ウェブ:
 画像: ${IMAGETAG:-defaultwebimage}
 ポート:
  - 「5000:5000」
 レディス:
 画像: "redis:alpine"

次に、IMAGETAG 変数が設定されていない場合は、defaultwebimage が適用されます。

この方法に加えて、後で紹介する .env ファイルを通じて環境変数のデフォルト値を設定することもできます。

コンテナに環境変数を渡す

まず、Compose ファイルでコンテナーの環境変数を設定する方法を見てみましょう。

ウェブ:
 環境:
 デバッグ: 1

Compose ファイル内の環境ノードは、コンテナの環境変数を設定するために使用されます。上記は以下と同等です。

$ docker run -e DEBUG=1

現在のシェル環境変数の値をコンテナの環境変数に渡すことも非常に簡単です。上記のコードの割り当て部分を削除するだけです。

ウェブ:
 環境:
 デバッグ:

この場合、環境変数 DEBUG が現在のシェルでエクスポートされていない場合は、compose ファイルでは null として解釈されます。

環境変数 DEBUG をエクスポートしようとすると:

$ エクスポート DEBUG=1 

これは私たちが設計した正しい使用シナリオです。

ファイルを使用してコンテナの複数の環境変数を設定する

environment を介してコンテナの環境変数を設定するだけでは物足りないと思われる場合は、docker-run の --env-file パラメータなどのファイルを介してコンテナの環境変数を設定することもできます。

ウェブ:
 環境変数:
 -web-variables.env

web-variables.env ファイルへのパスは docker-compose.yml ファイルに対する相対パスであることに注意してください。上記のコードは次のコードと同じ効果があります。

$ docker run --env-file=web-variables.env

web-variables.env ファイルでは、1 つ以上の環境変数を定義できます。

#Webコンテナ環境を定義する
アプリ名=helloworld
著者=ニック・リー
バージョン=1.0

結果を確認してください:

compose は env_file 設定を環境に変換することがわかりました。

.env ファイル

docker-compose.yml ファイル内で多数の環境変数を参照する場合、環境変数ごとにデフォルト値を設定するのは面倒になり、docker-compose.yml のシンプルさにも影響します。この時点で、.env ファイルを使用して、docker-compose.yml ファイルによって参照されるすべての環境変数のデフォルト値を設定できます。
docker-compose.yml ファイルの内容を次のように変更します。

バージョン: '3'
サービス:
 ウェブ:
 画像: ${IMAGETAG}     
 環境:
  アプリ名:
  著者:
  バージョン:
 ポート:
  - 「5000:5000」
 レディス:
 画像: "redis:alpine"

次に、同じディレクトリに .env ファイルを作成し、その内容を次のように編集します。

# env var のデフォルト値を定義します。
イメージタグ=デフォルトのウェブイメージ
APPNAME=デフォルトのアプリ名
AUTHOR=デフォルトの著者名
VERSION=デフォルトのバージョンは1.0です

結果を確認します。すべての環境変数が、.env ファイルで定義されたデフォルト値で表示されます。

さまざまなシナリオに合わせて環境変数を設定する

前のセクションからわかるように、Docker Compose は、docker-compose.yml ファイルで参照される環境変数を設定するのに十分な柔軟性を提供します。それらの優先順位は次のとおりです。

  1. ファイルを作成
  2. シェル環境変数
  3. 環境ファイル
  4. Dockerファイル
  5. 変数が定義されていません

まず、 docker-compose.yml ファイルに直接設定された値が最も優先されます。
次に、現在のシェルでエクスポートされた環境変数の値が続きます。
次は環境変数ファイルで定義された値です。
次はDockerfileで定義された値です。
最後に、該当する環境変数が見つからない場合は、環境変数が定義されていないとみなされます。

上記の優先順位の定義に従って、異なるシェル スクリプトで異なるシナリオの環境変数を定義し、エクスポートすることができます。次に、docker-compose コマンドを実行する前に、source コマンドを実行して、シェル スクリプトで定義された環境変数を現在のシェルにエクスポートします。こうすることで、環境変数を管理する場所の数を減らすことができます。次の例では、docker-compose.yml ファイルがあるディレクトリに test.sh と prod.sh を作成します。test.sh の内容は次のとおりです。

#!/bin/bash
# env var のデフォルト値を定義します。
エクスポート IMAGETAG=web:v1
APPNAME=HelloWorld をエクスポートする
エクスポート AUTHOR=Nick Li
エクスポート VERSION=1.0

prod.sh の内容は次のとおりです。

#!/bin/bash
# env var のデフォルト値を定義します。
エクスポート IMAGETAG=webpord:v1
APPNAME=HelloWorldProd をエクスポートします
エクスポート AUTHOR=Nick Li
エクスポート VERSION=1.0LTS

テスト環境で、次のコマンドを実行します。

$ ソース test.sh
$ docker-compose 設定

このとき、docker-compose.yml 内の環境変数はテスト環境に関する設定を適用します。

実稼働環境では、次のコマンドを実行します。

$ ソースprod.sh
$ docker-compose 設定

このとき、docker-compose.yml 内の環境変数は本番環境に関する設定を適用します。

要約する

Docker Compose は、環境変数の豊富なサポートと柔軟な使用を提供します。この記事の概要が、関連する使用方法を明確にし、さまざまな使用シナリオを簡潔にサポートするのに役立つことを願っています。

参照:

CLI環境変数を作成する
Compose の環境変数
ファイル変数の置換を作成する
ファイル内でデフォルトの環境変数を宣言する

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Docker Compose で利用可能な環境変数の詳細な説明
  • Docker での環境変数の使用とよくある問題の解決策

<<:  Vue3 の動的コンポーネントはどのように機能しますか?

>>:  MySQL でストアド プロシージャを作成し、ループでレコードを追加する方法

推薦する

after疑似要素を使用して中空の三角矢印とXアイコンを実装する例

フロントエンドのデザイン案では、「X」や「>」の形をした閉じるボタンや、他の 3 方向の白抜き...

MySQL インデックスの詳細な説明

目次1. インデックスの基本1.1 はじめに1.2 インデックスの仕組み1.3 インデックスの種類1...

MySQL の単一テーブル クエリ操作例の詳細な説明 [構文、制約、グループ化、集計、フィルタリング、並べ替えなど]

この記事では、MySQL の単一テーブル クエリ操作について説明します。ご参考までに、詳細は以下の通...

メタ宣言注釈の手順

メタ宣言注釈の手順: 1. モバイル ページと 1 対 1 で対応するすべての PC ページを分類し...

JavaScript の高度なクロージャの説明

目次1. 閉鎖の概念追加の知識ポイント: 2. 閉鎖の役割: 3. 閉鎖例3.1 liをクリックする...

Linux ファイル記述子、ファイルポインタ、および inode の詳細

目次Linux - ファイル記述子、ファイルポインタ、インデックスノード1. Linux - ファイ...

15行のCSSコードがAppleデバイスをクラッシュさせる可能性があり、最新のiOS 12も例外ではない

たった15行のCSSでiPhoneがクラッシュするWire のセキュリティ研究者 Sabri Had...

HTML の値属性と名前属性の機能と使用法の紹介

1. ボタンで使用される値は、「OK」、「削除」など、ボタンに表示されるテキストを指します。 2. ...

CentOS 7 構成 Tomcat9+MySQL ソリューション

Tomcatの設定まずTomcatをインストールするTomcatのインストールは、Tomcatのイン...

Vue.js $refs 使用例の説明

プロパティやイベントがあるにもかかわらず、JavaScript で子コンポーネントに直接アクセスする...

異なるドメイン名への PC または携帯電話のアクセスを区別するように Nginx を構成する方法

新しい公式サイトはオンラインですが、携帯電話で新しい公式サイトにアクセスすると、エクスペリエンスが非...

XHTML 入門チュートリアル: テーブルタグの応用

<br />テーブルは XHTML では扱いにくいタグなので、このセクションで理解するだ...

Mysqlのマージ結果と水平スプライシングフィールドの実装手順

序文最近、レポート機能に取り組んでいたのですが、ある月に各部署に入社した人と退職した人の数をカウント...