Dockerコンテナーから環境変数を取得する


124

Dockerfileで宣言されていないdockerコンテナーから環境変数を取得する最も簡単な方法は何ですか?

たとえば、いくつかのdocker exec container /bin/bashセッションを通じて設定された環境変数ですか?

できdocker exec container env | grep ENV_VARますが、値を返すだけのほうがいいです。

私はを使用してみましたdocker exec container echo "$ENV_VAR"が、置換はコンテナーの外で行われているようです。そのため、コンテナーからenv変数を取得するのではなく、自分のコンピューターからenv変数を取得します。

ありがとう。


envとgrepを使用しない理由はありますか?
aisbaa

値だけが必要です。私が正しく理解していれば、grep呼び出しの出力を解析する必要がありますが、それは避けたいと思います。
Citronen、2015

execセッションで設定された変数は、プライマリプロセスまたは後続のexecセッションに影響しないと思っていましたか?
Paul Becotte

回答:


136

echo "$ENV_VAR"変数置換がコンテナーで発生するようにコンテナー内で実行する適切な方法は次のとおりです。

docker exec <container_id> bash -c 'echo "$ENV_VAR"'

4
これらすべての答えはいくつかのシェルに依存することに注意してください。実行可能ファイルとスクラッチベースイメージで環境変数を取得できません。
リチャード

docker run --rm -it CONTAINER bash -c 'echo "$MY_ENV_VAR"'
Henrik

「エラー:そのようなコンテナーはありません:コンテナー」というエラーが発生します。SSHでログイン後、コマンドを実行しています。
kunwar nitesh

1
@kunwarnitesh:「container」を、操作するコンテナの名前に置き換える必要があります。
jwodder

1
containerそれが変数であることを人々が理解できるように言葉を作る
Anwar

117

すべての環境変数を表示するには:

docker exec container env

取得するには:

docker exec container env | grep VARIABLE | cut -d'=' -f2

私の質問は、私はそのルートに行きたくないと言います。また、フォローアップの質問:docker exec container envそしてdocker exec -it container /bin/bashenv別のものを吐き出します。どうして?
Citronen、2015

ああ...私がこれを
真実に

2
うーん、今はもっと難しい。お試しくださいdocker inspect container
aisbaa

docker inspect container同じ制限があるようです。コンテナーを実行した後に環境変数を作成すると、docker inspect(envセクションの)への呼び出しに表示されません。
Citronen、2015

これは現在受け入れられている答えよりも良い答えだと思います。bashコマンドでサポートされていないコンテナがいくつかありalpine-nodeます。したがって、使用exec container bash -c "echo $ENV_VAR"は機能しません。exec container env私の場合は作品を使用しています。使用してexec container printenvも動作します。
rahmatns

78

printenv VARIABLE代わりに使用できます/bin/bash -c 'echo $VARIABLE。これははるかに単純であり、置換を実行しません。

docker exec container printenv VARIABLE

7
これが最後の答えになるはずです
KiJéy18年

5
または単にprintenvすべての変数を出力します。
naXa

これはkubernetesでも機能します:kubectl exec pod-name printenv MY_VARIABLE。
Teebu

58

使用の欠点docker execは、実行中のコンテナが必要になるためdocker inspect -f、コンテナが実行されているかどうか不明な場合に便利です。

例1。指定されたコンテナのスペースで区切られた環境変数のリストを出力します。

docker inspect -f \
   '{{range $index, $value := .Config.Env}}{{$value}} {{end}}' container_name

出力は次のようになります。

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3

例2。各env varを新しい行とgrep必要な項目に出力します。たとえば、mysqlコンテナーの設定は次のように取得できます。

docker inspect -f \
    '{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' \
    container_name | grep MYSQL_

出力されます:

MYSQL_PASSWORD=secret
MYSQL_ROOT_PASSWORD=supersecret
MYSQL_USER=demo
MYSQL_DATABASE=demodb
MYSQL_MAJOR=5.5
MYSQL_VERSION=5.5.52

例#3。上記の例を変更して、スクリプトで直接使用できるbashフレンドリーな出力を取得します。

docker inspect -f \
   '{{range $index, $value := .Config.Env}}export {{$value}}{{println}}{{end}}' \
   container_name | grep MYSQL

出力されます:

export MYSQL_PASSWORD=secret
export MYSQL_ROOT_PASSWORD=supersecret
export MYSQL_USER=demo
export MYSQL_DATABASE=demodb
export MYSQL_MAJOR=5.5
export MYSQL_VERSION=5.5.52

さらに詳しく知りたい場合は、フォーマットの詳細がすべて記載されたGoのテキスト/テン​​プレートパッケージのドキュメントにアクセスしてください。


1
それが最良の答えです。別の質問(コンテナーがダウンしているとき)の答えになると思います
Nickolay Kondratenko 2018

これが私にとってうまくいった唯一の答えです。docker exec私のコンテナは知らないといつも言っていました。
おやすみオタクプライド

7

上記の回答はどれも、実行していないコンテナから変数を抽出する方法を示していません( echoアプローチをrun、出力は得られません)。

単純runprintenv、次のように:

docker run --rm <container> printenv <MY_VAR>

(作品のdocker-compose代わりにdockerも注意してください)


とても簡単です!私はこのアプローチを受け入れました。
opncow

または単にprintenvすべての変数を出力します。
naXa


0

@aisbaaの答えは、環境変数がいつ宣言されたかを気にしない場合に機能します。exec /bin/bashセッション内で宣言されている場合でも、環境変数が必要な場合は、次のように使用します。

IFS="=" read -a out <<< $(docker exec container /bin/bash -c "env | grep ENV_VAR" 2>&1)

それはあまりきれいではありませんが、仕事を成し遂げます。

その後、値を取得するには、以下を使用します。

echo ${out[1]}

jwodderの回答を参照してください。
Citronen

0

このコマンドは、ホスト内のDockerスタックプロセスの環境を検査します。

pidof   dockerd containerd containerd-shim | tr ' ' '\n' \
      | xargs -L1 -I{} -- sudo xargs -a '/proc/{}/environ' -L1 -0

0

コマンドを使用entrypointして、実行していないコンテナを変更できdocker runます。

例のPATH環境変数:

  1. bashandの使用echo:この回答は、echo出力が生成されないと主張していますが、これは誤りです。

    docker run --rm --entrypoint bash <container> -c 'echo "$PATH"'
  2. を使用して printenv

    docker run --rm --entrypoint printenv <container> PATH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.