我在5个不同的CentOS节点上使用Rancher安装了一个Kubernetes集群(比如node1,node2,...,node5)。对于我们的CI运行,我们需要在每次运行之前清理过时的docker镜像。我创建了一个在node1上运行的脚本,并且从node1到其余节点启用了无密码ssh。脚本的相关部分如下所示:
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 rmifor循环内的命令运行所有其他4个节点,但我得到Error: No such image: 每个图像的错误。但是如果我在该节点上执行相同的命令,它就会成功。我不确定这里有什么问题。
问题是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"
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。