如何使用 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

然后我不知道该怎么办。我尝试使用xargsto 作为变量传递,但我不知道如何在命令行中动态地frontend:prod_v_1_2将xargs 更改为 。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

当您添加越来越多的命令时,您的管道方法可能会变得复杂。只需使用本机 shell 的强大功能,在本例中bash即可执行此类操作。将 的输出通过管道传输grep image docker-compose.yml到循环中while..read并用它执行替换。

在正确的 shell 脚本中,可以这样做

#!/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)

在命令行上,xargs我会awk直接使用来运行 docker save 操作

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

相关内容