bash 中的条件

Conditions in bash

Bash 我的 Jenkins 管道的脚本按条件删除所有 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如果从不调用则不调用删除?

您应该可以进行两步操作,例如:

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

如果您在字段中有 white-space,您通常需要注意边缘情况,但是,因为根据 docker doco(试着说 that 快三遍),这应该不是问题。

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

  • 将 ID 移动到输出中的第一个字段,以防存储库或标签中可能有 spaces(这会搞砸字段选择,即使 doco 声明这可能不是问题);
  • 将您的 grep/cut 组合组合成一个 awk(也针对之前的要点进行了调整);和
  • 从输出中删除了存储库名称,因为存储库名称如“populatestandardmachine”将导致该存储库被忽略regardless 标签。

像这样:

while IFS= read -r _ _ img; do
  docker rmi -f "$img"
done < <(
  docker images --format="{{.Repository}} {{.Tag}} {{.ID}}" | grep -v ' latest '
)

使用 GNU xargs。

将选项 --no-run-if-empty-r 添加到您的 xargs 命令。