Dockerコンテナの内部IPを確認し、それをyaml設定ファイルの値として使用しようとしています。 IPを確認するコマンドは次のとおりです。
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' controller-control-plane
そして、設定を編集するには、次を使用しています。
yq -i '.kubeslice.controller.endpoint = "https://<output_from_previous_command>:6443"' values.yaml
最初のコマンドを次のパラメーターとして使用するには、次のようにします。
yq '.kubeslice.controller.endpoint = "https://$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' controller-control-plane):6443"' values.yaml
これにより、出力が期待どおりに機能しなくなります。
kubeslice:
controller:
loglevel: info
rbacResourcePrefix: kubeslice-rbac
projectnsPrefix: kubeslice
endpoint: https://$(docker inspect -f {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}} controller-control-plane):6443
エンドポイントがコマンド文字列の代わりに正しいIP値を取得するようにこれを正しく実行するにはどうすればよいですか?
答え1
主な問題は、単一引用符で囲まれた文字列とコマンド置換を使用しようとしていることです。以内に一重引用符で囲まれた文字列。一重引用符で囲まれた文字列には一重引用符を含めることはできません。一重引用符で囲まれた文字列内では、置換項目は通常無視されます。
その後の質問は、コマンド置換の結果を挿入したいようです。まっすぐ編集中のYAMLに追加してください。データを引用またはエンコードする必要があるため、これは不適切です。
代わりにAndrey Kislyukyq
のhttps://kislyuk.github.io/yq/、コマンドを使用してデータを抽出し、エンドポイントURL値を設定するために使用できるdocker inspect
内部変数を初期化します。yq
yq -y -i --arg addr "$(
docker inspect \
-f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
controller-control-plane
)" \
'.kubeslice.controller.endpoint = "https://" + $addr + ":6443"' values.yaml
Mike Farahのを使用している場合は、yq
代わりにviaを介して往復してjq
データを正しく挿入できます。
yq -o json values.yaml |
jq --arg addr "$(
docker inspect \
-f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
controller-control-plane
)" \
'.kubeslice.controller.endpoint = "https://" + $addr + ":6443"' |
yq -P -o yaml >values.yaml.new &&
mv values.yaml.new values.yaml
これはマイクを使用してyq
YAMLをJSONに変換するか、その逆に変換します。これを実行できる他のプログラムを使用できます。例えば、スティーブン・レビンyj
。
答え2
x = "y"
渡された項目に二重引用符を使用する必要があるとしますyq
。
yq -i ".kubeslice.controller.endpoint = \"https://$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' controller-control-plane):6443\"" values.yaml
答え3
xargs を使用して、最初のコマンドの出力を構成を編集する2番目のコマンドの引数として渡すことができます。
docker inspect -f \
'{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
controller-control-plane | xargs -I{} yq \
'.kubeslice.controller.endpoint = "https://{}:6443"' values.yaml
出力:
kubeslice:
controller:
loglevel: info
rbacResourcePrefix: kubeslice-rbac
projectnsPrefix: kubeslice
endpoint: https://172.18.0.3:6443