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

推薦する

MySQL タイムスタンプ比較クエリで遭遇する落とし穴と解決策

目次タイムスタンプ比較クエリで遭遇する落とし穴タイムスタンプクエリ範囲の問題タイムスタンプ比較クエリ...

MYSQL(電話番号、IDカード)データ非感応化の実装

1. データ感度低下の説明日常の開発ニーズでは、データの感度低下が頻繁に発生します。たとえば、ID ...

フォームタグの Enctype 属性とその応用例の紹介

Enctype : ブラウザがデータをサーバーに送り返すときに使用するエンコーディングのタイプを指定...

Docker swarm を使用して Nebula Graph クラスターを迅速にデプロイする方法のチュートリアル

1. はじめにこの記事では、Docker Swarm を使用して Nebula Graph クラスタ...

CSS3 を使用して 3D テキスト ホバー効果を実装するサンプル コード

この記事では、3D テキストのホバー変更効果を実現するための CSS3 のサンプル コードを紹介しま...

Docker を使用した nextcloud パーソナル ネットワーク ディスクの構築に関するチュートリアル

目次1. はじめに2. 導入環境ツール4. 展開プロセス要約する1. はじめにNextcloud は...

MySQLが中国語の文字を挿入する問題を永久に解決するコツを教えます

目次序文最初のステップ:ステップ2: このmy.iniを変更する要約する序文問題の説明:不正な文字列...

Nginx リバース プロキシと負荷分散の実践

リバースプロキシリバースプロキシとは、プロキシサーバーを介してユーザーのアクセス要求を受信し、ユーザ...

MySQL ページングクエリ最適化テクニック

ページング クエリを使用するアプリケーションでは、LIMIT と OFFSET を含むクエリが非常に...

フロントエンド例外 502 不正なゲートウェイの原因と解決策

目次502 不正なゲートウェイ エラーの発生1. 502 不正なゲートウェイ エラーとは何ですか? ...

Docker で最初のアプリケーションをデプロイする方法

前回の記事では、Docker Desktop をインストールし、Kubernetes を有効にしまし...

JavaScript ES6 モジュールの詳細な説明

目次0. モジュールとは何か1.モジュールの読み込み1.1 方法1 1.2 方法2 2. 輸出と輸入...

CSS でよく発生する問題の整理 (ロゴのハッキング/コンテナの固定/画像の垂直方向の中央揃え)

1. IEブラウザモードハックロゴ1. CSSハックロゴコードをコピーコードは次のとおりです。 ie...

HTML フレームセットのサンプルコード

この記事では、Frameset が作成した、できるだけシンプルなフレームワークを紹介します。さて、ま...

MySQLでトリガーを作成する方法

この記事の例では、参考のためにMySQLトリガーを作成するための具体的なコードを共有しています。具体...