首页 > 解决方案 > bash 中的条件

问题描述

我的 Jenkins 管道的 Bash 脚本按条件删除所有 docker 图像:

docker images --format="{{.Repository}} {{.Tag}} {{.ID}}" |
grep -v "latest" |
cut -d ' ' -f3 |
xargs docker rmi -f

但有时图像列表为空cut -d ' ' -f3,我收到错误:

"docker rmi" requires at least 1 argument.

更新输出docker images --format="{{.Repository}} {{.Tag}} {{.ID}}"

adoptopenjdk/openjdk11 latest                5578e7619e88
Nginx                  latest                2622e6cca7eb

xargs docker rmi -f如果从不删除,我如何重写脚本以不调用不调用?

标签: bashxargs

解决方案


您应该能够执行两步过程,例如:

ids="$(docker images --format='{{.ID}} {{.Tag}}' | awk '!/latest/{print $1}')"
if [[ -n "${ids}" ]] ; then
    for id in ${ids} ; do
        docker rmi -f ${id}
    done
fi

如果字段中有空白,您通常必须注意边缘情况,但是,由于所有这三个字段似乎都不允许按照dockerdoco 的空白(尝试说三倍),那不应该成为一个问题。

您会注意到其他一些变化:

  • 将 ID 移动到输出中的第一个字段,以防存储库或标签中可能有空格(这会搞砸字段选择,即使 doco 声明它可能不是问题);
  • 将您的grep/cut组合组合成一个awk(也调整上一个要点);和
  • 从输出中删除了存储库名称,因为像“ popu latest andardmachine”这样的存储库名称将导致无论标签如何都会忽略该存储库。

推荐阅读