【问题标题】:Conditions in bash [duplicate]bash中的条件[重复]
【发布时间】:2020-10-23 16:37:01
【问题描述】:

我的 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 不调用?

【问题讨论】:

  • docker images --format="{{.Repository}} {{.Tag}} {{.ID}} 的输出是什么?

标签: bash xargs


【解决方案1】:

使用 GNU xargs。

在您的 xargs 命令中添加选项 --no-run-if-empty-r

【讨论】:

    【解决方案2】:

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

    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
    

    如果字段中有空格,您通常必须注意边缘情况,但是,因为根据docker doco,所有这三个字段似乎都不允许空格(尝试说 快三倍),这应该不是问题。

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

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

    【讨论】:

    • 最好使用数组,并使用正确的列
    • @Gilles,如果您可以将任意命令(可能包含任意空格)的输出放入数组中,请务必告诉我,我会将其添加到答案中,当然假设我这样做的方式存在实际的问题。我怀疑这是可行的,因为据我所知,这三个字段都不允许空白。但我不确定你为什么认为我使用了错误的列,我都将所需的列移到了每一行的开头并且使用了$1 来获取它。跨度>
    【解决方案3】:

    像这样:

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

    【讨论】:

      猜你喜欢
      • 2013-05-22
      • 1970-01-01
      • 2013-02-04
      • 2013-11-14
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 2012-03-11
      相关资源
      最近更新 更多