linux - 在 CentOS 上远程删除 docker 镜像的问题
问题描述
我已经在 5 个不同的 CentOS 节点(比如说 node1、node2、...、node5)上使用 Rancher 安装了一个 Kubernetes 集群。对于我们的 CI 运行,我们需要在每次运行之前清理陈旧的 docker 镜像。我创建了一个在 node1 上运行的脚本,并且从 node1 到其余节点启用了无密码 ssh。脚本的相关部分如下所示:
#!/bin/bash
helm ls --short --all | xargs -L1 helm delete --purge
echo "Deleting old data and docker images from Rancher host node."
rm -rf /var/lib/hadoop/* /opt/ci/*
docker images | grep localhost | awk '{print $3}' | xargs docker rmi -f
hosts=(node2 node3 node4 node5)
for host in ${hosts[*]}
do
echo "Deleting old data and docker images from ${host}"
ssh root@${host} docker images | grep localhost | awk '{print $3}' | xargs docker rmi -f
ssh root@${host} rm -rf /var/lib/hadoop/* /opt/ci/*
done
echo "All deletions are complete! Proceeding with installation."
sleep 2m
问题是,虽然docker rmi
for 循环内的命令对所有其他 4 个节点运行,但我得到Error: No such image: <image-id>
每个图像的错误。但是,如果我在该节点上执行相同的命令,它就会成功。我不确定这里有什么问题。任何帮助表示赞赏。
解决方案
问题是 ssh 管道中唯一的第一个命令是远程执行的:
ssh root@${host} docker images | grep localhost | awk '{print $3}' | xargs docker rmi -f
壳牌明白是
ssh ssh-arguments | grep grep-arguments | awk awk-arguments | xarg xarg-arguments
结果是唯一docker images
的远程执行。然后远程的输出docker images
被传输到本地机器,在本地机器上进行过滤grep
,awk
然后docker rmi
在本地机器上执行。
有必要添加引号以告知 shell 命令行中的所有内容都是 ssh 参数:
ssh root@${host} "docker images | grep localhost | awk '{print $3}' | xargs docker rmi -f"
推荐阅读
- ag-grid - npm install 后无法引用 html2pdf
- sql - 如何在 Oracle 数据库中获取更多列值以及不同的列?
- java - 使用 @JsonPropperty 提取具有相同前缀的键的值列表
- java - 使用休眠将一个对象保存在多个其他对象中
- firefox - 在 Firefox 中调试美化的 Js - Quantum
- postgresql - Postgresql 转轴
- vue.js - 如何以编程方式向 Vue 组件添加道具?
- vue.js - 如何删除vue表中的整列?
- php - 如何获取我在表中选择的数据行的 ID?
- jenkins - jenkins如何将liferay7 portlet部署到远程服务器?