bash - 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
如果从不删除,我如何重写脚本以不调用不调用?
解决方案
您应该能够执行两步过程,例如:
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
(也调整上一个要点);和 - 从输出中删除了存储库名称,因为像“ popu latest andardmachine”这样的存储库名称将导致无论标签如何都会忽略该存储库。
推荐阅读
- reporting-services - SSRS 报告垂直合并单元格
- c - 访问动态分配的 C 结构数组时出现段错误
- kubernetes - kubeadm init kubelet 抱怨默认绑定地址已在使用中
- dart - 如何将小部件构造函数作为参数传递给另一个小部件以构建
- java - ConcurrentSkipListMap.compute() 对于相对更新是否安全?
- authentication - SPA + API 服务器 + 3rd 方 OAuth 身份验证
- ruby-on-rails - 覆盖 ApplicationController 方法的适当位置
- r - 使用 map2(~ggplot...?
- ios - 在明暗主题之间切换
- for-loop - 遍历 ArrayList