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

推薦する

mysql5.7.14 解凍版インストールと設定方法 グラフィックチュートリアル (win10)

Win10はmysql5.7の解凍版をインストールします。参考までに、具体的な内容は次のとおりです...

ハイパーコネクションの4つの状態の適用の詳細な説明

ブラウザの問題かもしれないと思うかもしれませんが、スタイル定義の順序が間違っている可能性が高いです。...

JSはマップを使用してdouble配列を統合します

目次序文データのシミュレーション結合されたデータ合併のアイデアコードの表示と分析最初のステップステッ...

本をめくる効果を実現するネイティブJS

この記事では、ネイティブ JS で実装された本をめくる効果の図を紹介します。効果は次のとおりです。 ...

VueにおけるAxios非同期通信の詳細な説明

1. まず、インタラクティブに使用するための .json ファイルを作成します。json データ形式...

docker run後にコンテナがExited (0)と表示される問題を解決する

Centos7 上で openresty 用の Dockerfile を作成し、ビルドしました。 d...

Apache Bench で Web ストレス テストを実装する方法

1. Apache Benchの紹介ApacheBench は、Apache サーバーに付属する W...

シンプルな加算計算機の JavaScript 実装

この記事では、参考までに、加算計算機を実装するためのJavaScriptの具体的なコードを紹介します...

CSS3はキングをマッチングさせるときにパーティクルアニメーション効果を実現します

コーディングをしていると、多くのことが同じ結末を迎えることに気づくでしょう。問題を解決する方法は何千...

レスポンシブWebデザイン学習(2) — 動画をレスポンシブにすることはできるのか?

前回のエピソードレビュー:昨日は、ページがさまざまなデバイス サイズにどのように対応するかについて説...

Centos7 で ZooKeeper3.4 ミドルウェアを構築するための一般的なコマンドの概要

1.ダウンロードして解凍する1. Zookeeperの紹介分散サービス フレームワークとして、Zoo...

ウェブページコンテンツの閲覧設計手法に関する議論

<br />コンテンツ ページの記事の場合、記事が長すぎる場合やカテゴリ (ランキング)...

インライン要素スパンの最小高さの定義

span タグは HTML ウェブページを作成するときによく使用されますが、このタグの使い方がよくわ...

Gobangゲームを実現するためのjsキャンバス

この記事では、Gobangゲームを実装するためのキャンバスの具体的なコードを参考までに共有します。具...

MySQL のロック待機とデッドロック問題の分析

目次序文: 1. ロック待機とデッドロックを理解する2. 現象の再発と治療要約:序文: MySQL ...