1. 概要

多くの場合、サービスを構成から分離することをお勧めします。 12ファクターのアプリの場合、構成を環境に保存する必要があります

もちろん、これは、構成をサービスに注入する方法が必要になることを意味します。

このチュートリアルでは、環境変数をDockerコンテナーに渡すことでこれを実現します。

2. –env -eを使用

このチュートリアルでは、Alpineと呼ばれる小さな(5MB)Linuxイメージを使用します。 画像をローカルにプルすることから始めましょう:

docker pull alpine:3

Dockerコンテナーを起動すると、パラメーター –env (またはその短縮形 -e []を使用して、環境変数をキーと値のペアとしてコマンドラインに直接渡すことができます。 X189X])。

たとえば、次のコマンドを実行してみましょう。

$ docker run --env VARIABLE1=foobar alpine:3 env

簡単に言えば、コンソールに設定した環境変数を反映しています。

VARIABLE1=foobar

ご覧のとおり、Dockerコンテナは変数VARIABLE1を正しく解釈します。

また、変数がローカル環境にすでに存在する場合は、コマンドラインで値を省略できます。

たとえば、ローカル環境変数を定義しましょう。

$ export VARIABLE2=foobar2

次に、値なしで環境変数を指定しましょう。

docker run --env VARIABLE2 alpine:3 env

そして、Dockerがまだ値を取得していることがわかります。今回は、周囲の環境からです。

VARIABLE2=foobar2

3. –env-fileを使用する

変数の数が少ない場合は、上記の解決策で十分です。 ただし、変数が一握り以上になるとすぐに、面倒でエラーが発生しやすくなります。

別の解決策は、標準の key = value 形式を使用して、テキストファイルを使用して変数を格納することです。

my-env.txtと呼ぶファイルにいくつかの変数を定義しましょう。

$ echo VARIABLE1=foobar1 > my-env.txt
$ echo VARIABLE2=foobar2 >> my-env.txt
$ echo VARIABLE3=foobar3 >> my-env.txt

それでは、このファイルをDockerコンテナに挿入しましょう。

$ docker run --env-file my-env.txt alpine:3 env

最後に、出力を見てみましょう。

VARIABLE1=foobar1
VARIABLE2=foobar2
VARIABLE3=foobar3

4. DockerComposeの使用

Docker Composeは、環境変数を定義する機能も提供します。 この特定の主題に興味がある人は、DockerComposeチュートリアルで詳細を確認してください。

5. 敏感な値に注意してください

多くの場合、変数の1つは、データベースまたは外部サービスへのパスワードになります。 これらの変数をDockerコンテナに挿入する方法に注意する必要があります。

ソース管理システムやOSプロセスリストなど、予期しない場所に機密値が漏洩するリスクが高いため、コマンドラインを介してこれらの値を直接渡すことはおそらく最も安全性が低くなります。

ローカル環境またはファイルで機密性の高い値を定義することをお勧めします。どちらも不正アクセスから保護できるためです。

ただし、Dockerランタイムにアクセスできるすべてのユーザーが、実行中のコンテナーを検査してシークレット値を検出できることを理解することが重要です

実行中のコンテナを調べてみましょう。

docker inspect 6b6b033a3240

出力には、環境変数が表示されます。

"Config": {
    // ...
    "Env": [
       "VARIABLE1=foobar1",
       "VARIABLE2=foobar2",
       "VARIABLE3=foobar3",
    // ...
    ]
}

セキュリティが懸念される状況では、Dockerが DockerSecretsと呼ばれるメカニズムを提供していることに言及することが重要です。 Kubernetes 、AWS、Azureなどのコンテナサービスも同様の機能を提供します。

6. 結論

この短いチュートリアルでは、環境変数をDockerコンテナーに挿入するためのいくつかの異なるオプションについて説明しました。

それぞれのアプローチはうまく機能しますが、私たちの選択は、最終的にはセキュリティや保守性などのさまざまなパラメータに依存します。