既存のdocker-entrypointスクリプトに機能を追加しようとしましたが、イメージ作成者は環境変数の型をkey.subkey = valueにしました。私は私の変数を設定して解析するまで、これが間違った命名スキームであることを知りませんでした。命名スキームが無効であるため、次のように読みます。
while IFS='=' read -r var key
do
# parse
done < <(env)
私が望むのは、使用後に自分自身の「無効な」環境変数を設定解除する修正されたエントリポイントをインストールすることです。それ以外の場合、私の変数は正規表現パターンによって捕捉され、スクリプトは終了します。これは、キャプチャされた変数をバイナリにオプションとして渡すためです。
とにかくDockerの環境変数機能を使用して強制的に設定された誤った変数を元に戻すことはできますか?私がこれをしようとしたとき:
unset -v foo.foo-bar.setting-to-update
私は得る:
bash: unset: `foo.foo-bar.setting-to-update': not a valid identifier
ありがとう
答え1
ドッカーやその他の混乱なしに理解しやすくなります。サブルーチンに渡された環境から削除する名前が「odd」の環境変数がありますが、使用できません。unset
例えば
% env odd.variable=100 bash
bash-4.2$ env | grep odd
odd.variable=100
bash-4.2$ unset odd.variable
bash: unset: `odd.variable': not a valid identifier
env
パラメータを含むコマンドが-u
役立ちます。
bash-4.2$ env | grep odd
odd.variable=100
bash-4.2$ env -u odd.variable bash
bash-4.2$ env | grep odd
bash-4.2$
bash
この新しいシェルには奇妙な変数セットがないことがわかります。
複数の-uオプションを使用して複数の変数を設定解除できます。
したがって、変数が複数ある場合:
bash-4.2$ env | grep odd
odd.var2=200
odd.var3=300
odd.var1=100
それでは、すべて削除してもいいです。
bash-4.2$ env -u odd.var1 -u odd.var2 -u odd.var3 bash
bash-4.2$ env | grep odd
bash-4.2$
すべての変数名を知っていると簡単です。
名前はわかりませんが、パターンを認識できる場合(たとえば、すべての変数が「奇数」で始まる)、コマンドを作成できます。
例えば
to_remove=$(env | sed -n 's/^\(odd\.[^=]*\)=.*/-u \1/p')
このsed
コマンドは必要な-u
設定を生成します
例えば
bash-4.2$ env | grep odd
odd.var2=200
odd.var3=300
odd.var1=100
bash-4.2$ to_remove=$(env | sed -n 's/^\(odd\.[^=]*\)=.*/-u \1/p')
bash-4.2$ echo $to_remove
-u odd.var2 -u odd.var3 -u odd.var1
bash-4.2$ env $to_remove bash
bash-4.2$ env | grep odd
bash-4.2$
警告:変数名または内容に奇妙な文字(組み込みCR / LFシーケンスなど)が含まれると、問題が発生する可能性があります。しかし、一般的な状況では大丈夫でしょう!
これはすべてのプログラムに適用されます。
env -u odd.variable myscript