1. 概要

Dockerは、アプリケーションとそのすべての依存関係をパッケージ化するコンテナー化されたプラットフォームです。 理想的には、これらのアプリケーションを起動するには特定の環境が必要です。 Linuxでは、この要件を満たすために環境変数を使用します。 これらの変数は、アプリケーションの動作を決定します。

このチュートリアルでは、Dockerコンテナの実行中に設定されたすべての環境変数を取得する方法を学習します。 環境変数をDockerコンテナに渡す方法が複数あるのと同じように、一度設定すると、これらの変数をフェッチするさまざまな方法があります。

先に進む前に、まず環境変数の必要性を理解しましょう。

2. Linuxの環境変数を理解する

環境変数は、システム全体でアクセス可能なキーと値のペアの動的なセットです。 これらの変数は、システムがパッケージを見つけたり、サーバーの動作を構成したり、bashターミナルの出力を直感的にしたりするのに役立ちます。

デフォルトでは、ホストマシンに存在する環境変数はDockerコンテナに渡されません。 その理由は、Dockerコンテナがホスト環境から分離されていることになっているためです。 したがって、Dockerコンテナー内の環境を使用する場合は、明示的に設定する必要があります。

次に、Dockerコンテナ内から環境変数を取得するためのさまざまなアプローチを調べてみましょう。

3. docker execコマンドを使用してフェッチする

デモンストレーションの目的で、最初に Alpine Dockerコンテナーを実行し、それにいくつかの環境変数を渡します。

docker run -itd --env "my_env_var=baeldung" --name mycontainer alpine
9de9045b5264d2de737a7ec6ba23c754f034ff4f35746317aeefcea605d46e84

ここでは、mycontainerという名前のDockerコンテナ内に値baeldungを持つmy_env_varを渡します。

ここで、 docker exec コマンドを使用して、my_env_varという名前の環境変数をフェッチします。

$ docker exec mycontainer /usr/bin/env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=9de9045b5264
my_env_var=baeldung
HOME=/root

ここでは、Dockerコンテナ内で / usr / bin /envユーティリティを実行しています。 このユーティリティを使用すると、Dockerコンテナ内に設定されているすべての環境変数を表示できます。 my_env_varも出力に含まれていることに注意してください。

次のコマンドを使用して、同様の結果を得ることができます。

$ docker exec mycontainer /bin/sh -c /usr/bin/env
HOSTNAME=9de9045b5264
SHLVL=1
HOME=/root
my_env_var=baeldung
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/

前の出力と比較して環境変数が多いことに注意してください。これは、今回は / bin /shバイナリを使用してコマンドを実行しているためです。 このバイナリは、いくつかの追加の環境変数を暗黙的に設定します。

また、 / bin / sh シェルは、すべてのDockerイメージに存在する必要はありません。 たとえば、 / bin /bashシェルを含むcentos Dockerイメージでは、取得 環境変数使用 次の コマンド:

$ docker run -itd --env "container_type=centos" --name centos_container centos
aee6f2718f18723906f7ab18ab9c37a539b6b2c737f588be71c56709948de9eb
$ docker exec centos_container bash -c /usr/bin/env
container_type=centos
HOSTNAME=aee6f2718f18
PWD=/
HOME=/root
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env

docker exec コマンドを使用して、単一の環境変数の値をフェッチすることもできます。

$ docker exec mycontainer printenv my_env_var
baeldung

printenvは、Linuxの環境変数を表示する別のコマンドラインユーティリティです。ここでは、env変数名my_env_varを引数としてprintenvに渡します。 。 これにより、my_env_varの値が出力されます。

このアプローチの欠点は、環境変数を取得するためにDockerコンテナが実行状態である必要があることです。

4. docker inspectコマンドを使用してフェッチする

Dockerコンテナーが停止状態にあるときに、環境変数を取得するための別のアプローチを調べてみましょう。 この目的のために、 dockerinspectコマンドを使用します。

docker inspect は、すべてのDockerリソースの詳細情報を提供します。 出力はJSON形式です。 したがって、要件に従って出力をフィルタリングできます。

docker inspect コマンドを操作して、コンテナーの環境変数のみを表示してみましょう。

$ docker inspect mycontainer --format "{{.Config.Env}}"
[my_env_var=baeldung PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]

ここでは、 –format オプションを使用して、 dockerinspect出力から環境変数をフィルタリングしました。 ここでも、my_env_varが出力に表示されます。

docker inspect コマンドを使用して、単一の環境変数をフェッチすることもできます。

$ docker inspect mycontainer | jq -r '.[].Config.Env[]|select(match("^my_env_var"))|.[index("=")+1:]'
baeldung

jq は、JSONデータを解析および変換できる軽量のJSONプロセッサーです。 ここでは、 dockerinspectのJSON出力をjqコマンドに渡します。 次に、 my_env_var 変数を検索し、「=」で分割してその値を表示します。

コンテナIDは、 dockerexecおよびdockerinspectコマンドでも使用できることに注意してください。

docker exec とは異なり、 dockerinspectコマンドは停止中のコンテナーと実行中のコンテナーの両方で機能します。

5. 結論

この記事では、Dockerコンテナからすべての環境変数を取得する方法を学びました。 Linuxでの環境変数の重要性について説明することから始めました。 次に、 dockerexecおよびdockerinspect コマンドを調べて、環境変数を取得しました。

docker exec アプローチにはいくつかの制限がありますが、 dockerinspectコマンドはすべての状況で実行されます。