단일 명령으로 IP 주소 확인 및 구성 편집

단일 명령으로 IP 주소 확인 및 구성 편집

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 yqhttps://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를 사용하여 yqYAML을 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

관련 정보