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 でストアド プロシージャを作成し、ループでレコードを追加する方法

推薦する

タブバーの切り替え効果を実現するJavaScript

タブバー: 異なるタブをクリックすると異なるコンテンツが表示され、クリックしたタブのスタイルが変更さ...

Linuxカーネルをコンパイルする方法

1. 必要なカーネルバージョンをダウンロードする2. オペレーティングシステムにアップロードする3....

CSSの記述形式、モバイルページの基本構造の詳細な説明

1. CSSの記述形式1. インラインスタイルCSSコードを開始タグに直接記述することができます&l...

Js の継承とプロトタイプチェーンを理解するのに役立つ記事

目次継承とプロトタイプチェーン継承されたプロパティ継承されたメソッドJavaScript でのプロト...

JavaScript parseInt() と Number() の違いのケーススタディ

学習目標: parseInt() と Number() という 2 つの関数は、文字列をデータ型に変...

Vue の共通 A​​PI と高度な API の概要

目次次のチェックミックスイン$強制更新設定、削除フィルター指令その他の単純な共通プロパティとメソッド...

CSSアニメーション属性キーフレームの詳細な説明

コラムを更新してからどれくらい経ったでしょうか?半年ですか?今年の後半は、まさに離陸、つまり文字通り...

MySQL SHOW PROCESSLISTはトラブルシューティングの全プロセスを支援します

1. SHOW PROCESSLISTコマンドSHOW PROCESSLIST は実行中のスレッド ...

バッチモードでtopコマンドを実行する方法

top コマンドは、Linux システムのパフォーマンスを監視するために誰もが使用している最適なコマ...

HTMLページでチェックボックスを操作する方法

チェックボックスは Web ページで非常によく使用されます。e コマースの Web サイトでもプラッ...

CSS3は光る境界線効果を実現します

操作効果: html <!-- この要素は表示されません。DOM は JavaScript に...

MySQLデータベースバックアップのさまざまな実装方法の概要

この記事では、MySQL データベースのバックアップを実装するさまざまな方法について説明します。ご参...

Linux で MySQL データベースのデータ ファイル パスを変更する手順

rpm インストール方法を使用して MySQL データベースをインストールした後、データ ファイルの...

js キャンバスはランダムなパーティクル効果を実現します

この記事の例では、参考のためにjsキャンバスランダムパーティクルエフェクトの具体的なコードを共有して...

登録フォームのデザインルール

随分前に「Patterns for Sign Up & Ramp Up」を読み終えました。今...