在CentOS上远程删除Docker映像的问题

时间:2019-01-03 09:43:51

标签: linux bash docker kubernetes

我已经使用Rancher在5个不同的CentOS节点(比如node1,node2,...,node5)上安装了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

问题是,尽管for循环内的docker rmi命令在所有其他4个节点上运行,但每个图像我都得到了错误Error: No such image: <image-id>。但是,如果我在该节点上执行相同的命令,它将成功。我不确定这是什么问题。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

问题是ssh管道中唯一的第一个命令是远程执行的:

ssh root@${host} docker images | grep localhost | awk '{print $3}' | xargs docker rmi -f

Shell知道这是

ssh ssh-arguments | grep grep-arguments | awk awk-arguments | xarg xarg-arguments

结果是唯一的docker images被远程执行。然后,来自远程{{​​1}}的输出将传输到本地计算机,并由docker imagesgrep进行过滤,然后在本地计算机上执行awk

有必要添加引号来通知shell命令行中的所有内容都是ssh参数:

docker rmi