xargs를 사용하여 변수를 동적으로 설정하고 변경하는 방법은 무엇입니까?

xargs를 사용하여 변수를 동적으로 설정하고 변경하는 방법은 무엇입니까?

docker save -o하나의 명령으로 docker-compose.yaml 파일의 모든 이미지에 대해 작업을 수행하려고 합니다 .

내가 할 수 있었던 일은 다음과 같습니다.

cat docker-compose.yaml | grep image그러면 다음이 제공됩니다.

 image: hub.myproject.com/dev/frontend:prod_v_1_2
 image: hub.myproject.com/dev/backend:prod_v_1_2
 image: hub.myproject.com/dev/abd:v_2_3
 image: hub.myproject.com/dev/xyz:v_4_6

각 이미지에 대해 다음 명령을 실행해야 합니다.

docker save -o frontend_prod_v_1_2.tar hub.myproject.com/dev/frontend:prod_v_1_2

내가 달성한 것은 다음과 같습니다.

cat docker-compose.yml | grep image | cut -d ':' -f 2,3이것은 만든다:

 hub.myproject.com/dev/frontend:prod_v_1_2
 hub.myproject.com/dev/backend:prod_v_1_2
 hub.myproject.com/dev/abd:v_2_3
 hub.myproject.com/dev/xyz:v_4_6

나는 또한 할 수 있습니다:

cat docker-compose.yml | grep image | cut -d ':' -f 2,3 | cut -d '/' -f3 | cut -d ':' -f1,2

이것은 만든다:

 frontend:prod_v_1_2
 backend:prod_v_1_2
 abd:v_2_3
 xyz:v_4_6

그러면 나는 무엇을 해야할지 모르겠습니다. to를 사용하여 변수로 전달하려고 시도했지만 xargs명령줄에서 frontend:prod_v_1_2xargs를 동적으로 변경하는 방법을 모르겠습니다. frontend_prod_v_1_2.tar또한 끝에는 전체 이미지 이름과 태그가 필요합니다.

나는 비슷한 것을 찾고 있습니다 :

cat docker-compose.yml | grep image | cut -d ':' -f 2,3 | xargs -I {} docker save -o ``{} | cut -d '/' -f3 | cut -d ':' -f1,2 | xargs -I {} {}.tar`` {}

bash 마술사가 팁을 제공할 수 있나요?

답변1

점점 더 많은 명령을 추가하면 파이프라인 방법이 복잡해질 수 있습니다. 이 경우 bash해당 작업을 수행하려면 기본 쉘의 기능을 사용하십시오. 출력을 grep image docker-compose.yml루프로 파이프 while..read하고 이를 사용하여 교체를 수행합니다.

올바른 쉘 스크립트에서는 다음을 수행할 수 있습니다.

#!/usr/bin/env bash
# '<(..)' is a bash construct i.e process substitution to run the command and make 
# its output appear as if it were from a file
# https://mywiki.wooledge.org/ProcessSubstitution

while IFS=: read -r _ image; do
    # Strip off the part up the last '/'
    iname="${image##*/}"
    # Remove ':' from the image name and append '.tar' to the string and 
    # replace spaces in the image name
    docker save -o "${iname//:/_}.tar" "${image// }"
done < <(grep image docker-compose.yml)

명령줄에서 다음 을 사용하여 docker save 작업을 직접 실행합니다 xargs.awk

awk '/image/ { 
       n = split($NF, arr, "/"); 
       iname = arr[n]".tar"; 
       sub(":", "_", iname); fname = $2;  
       cmd = "docker save -o " iname " " fname; 
       system(cmd);
    }' docker-compose.yml

관련 정보