Dockerコンテナから環境変数を取得する最も簡単な方法は何ですかDockerfileで宣言されていません?
例えば、いくつかのdocker exec container /bin/bash
セッションを通して設定された環境変数はどうでしょうか。
私はdocker exec container env | grep ENV_VAR
を行うことができますが、私はただ値を返すものを好むでしょう。
私はdocker exec container echo "$ENV_VAR"
を使用しようとしました、しかし、置換はコンテナの外で起こるようです、それで私はコンテナからenv varを得ませんが、むしろ私のコンピュータからenv varを得ます。
ありがとう。
変数置換がコンテナ内で行われるようにコンテナ内でecho "$ENV_VAR"
を実行する適切な方法は、次のとおりです。
docker exec container bash -c 'echo "$ENV_VAR"'
すべてのenv変数を表示するには
docker exec container env
取得するには:
docker exec container env | grep VARIABLE | cut -d'=' -f2
printenv VARIABLE
の代わりに/bin/bash -c 'echo $VARIABLE
を使用することができます。それははるかに簡単であり、それは代用を実行しません:
docker exec container printenv VARIABLE
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の text/template パッケージのドキュメントにアクセスし、フォーマットの詳細をすべて確認してください。
上記の答えはどれも、実行されていないコンテナから変数を抽出する方法を示していません(echo
をrun
と一緒に使用した場合、出力は得られません)。
以下のように、単にrun
とprintenv
を組み合わせてください。
docker run --rm <container> printenv <MY_VAR>
(docker
の代わりにdocker-compose
も機能します)
このコマンドは、ホスト内のdocker stackプロセスの環境を検査します。
pidof dockerd containerd containerd-shim | tr ' ' '\n' \
| xargs -L1 -I{} -- Sudo xargs -a '/proc/{}/environ' -L1 -0
@ aisbaaの答えは、環境変数がいつ宣言されたかを気にしなくてもうまくいきます。 exec /bin/bash
セッション内で宣言されていても、環境変数が必要な場合は、次のようにします。
IFS="=" read -a out <<< $(docker exec container /bin/bash -c "env | grep ENV_VAR" 2>&1)
それはそれほどきれいではありませんが、それは仕事をやり遂げます。
値を取得するには、次のようにします。
echo ${out[1]}