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 Kislyuk yq
의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
이것은 Mike를 사용하여 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를 사용하여 첫 번째 명령의 출력을 구성을 편집하는 두 번째 명령에 대한 인수로 전달할 수 있습니다.
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