今天放假,终于有时间好好整整升级到Rancher2.x的问题了。
整理过程中发现,rancher 的Master节点上还有一大堆rancher1.6的容器在运行
创建时间为16months ago 的部分都是我需要清理的内容,有十几个容器,如果一个个的用docker stop、docker rm命令去清理非常非常的浪费时间,尤其对于我这种喜欢偷懒的人,简直就是噩梦。那么,有什么办法能够快速搞定呢?
数据分析思维
还是结合前面文章提到过的,数据分析的思维方式,从这里面先找到一些特征,然后再想办法用shell命令将符合这些特征的信息筛选出来,这个场景,有两个典型特征:
- 创建时间都包含了months这个词
- 镜像名称都是rancher开头的
最直接的想法就是利用shell的管道命令对命令行输出内容进行过滤:
$ sudo docker ps | grep months | grep rancher
2b0ec8efa4be rancher/healthcheck:v0.3.8 "/.r/r /rancher-entr…" 5 months ago Up 32 minutes r-healthcheck-healthcheck-2-718c3596
748878eee02f rancher/pipeline-jenkins-slave:v1.0.0 "/.r/r /usr/local/bi…" 16 months ago Up 32 minutes r-pipeline-jenkins-slave-1-3c9b6b14
877fd6a284e9 rancher/pipeline:v0.1.1 "/.r/r pipeline" 16 months ago Up 32 minutes r-pipeline-pipeline-server-1-27213a85
284dc5e69c47 rancher/pipeline-ui:v1.0.1 "/.r/r nginx -g 'dae…" 16 months ago Up 32 minutes r-pipeline-pipeline-ui-1-41caa855
11a7637d9ae2 rancher/net:v0.13.17 "/rancher-entrypoint…" 16 months ago Up 18 minutes r-ipsec-ipsec-router-7-ef568758
48dbf0299a05 rancher/net:v0.13.17 "/rancher-entrypoint…" 16 months ago Up 18 minutes r-ipsec-ipsec-connectivity-check-7-da5ca147
8bda2f0ac60b rancher/net:holder "/.r/r /rancher-entr…" 16 months ago Up 32 minutes r-ipsec-ipsec-7-678f2bc1
070cbde1af97 rancher/dns:v0.17.4 "/rancher-entrypoint…" 16 months ago Up 32 minutes r-network-services-metadata-dns-2-ad63c2d3
9d79e086b6a1 rancher/storage-ebs:v0.9.7 "start.sh storage --…" 16 months ago Up 32 minutes r-ebs-ebs-driver-1-ceeb9e21
97d80ebb05d2 rancher/metadata:v0.10.4 "/rancher-entrypoint…" 16 months ago Up 32 minutes r-network-services-metadata-2-aa4c144a
c6e7b715dfcc rancher/network-diagnostics-agent:v0.1.0 "/.r/r /rancher-entr…" 16 months ago Up 32 minutes r-network-diagnostics-network-diagnostics-agent-1-7d528bf7
ee0e70ae7dc2 rancher/net:v0.13.17 "/rancher-entrypoint…" 16 months ago Up 32 minutes r-ipsec-cni-driver-2-fe7bd76f
这样,我们成功的把我们需要的信息过滤出来了。
提取命令行输出内容的某列:
可能很多人都知道清理docker容器的命令:
sudo docker stop $(sudo docker ps -aq)
这里用到了shell命令的另外一个东西——()就是能够传递括号里面命令运行的结果。docker ps -aq 输出的只有容器的id,类似下面这样:
但是我们前面的命令包含了很多列的内容,所以接下来我们要想办法把运行结果的第一列取出来,这里我们可以用一个shell神器——awk:
$ sudo docker ps | grep months | grep rancher | awk '{print $1}'
2b0ec8efa4be
748878eee02f
877fd6a284e9
284dc5e69c47
11a7637d9ae2
48dbf0299a05
8bda2f0ac60b
070cbde1af97
9d79e086b6a1
97d80ebb05d2
c6e7b715dfcc
ee0e70ae7dc2
接下来,我们就要把这个输出内容和清理docker的stop和rm命令连接起来,这时候就可以用前面提到的$()了:
$ sudo docker stop $(sudo docker ps -a | grep months | grep rancher | awk '{print $1}')
$ sudo docker rm $(sudo docker ps -a | grep months | grep rancher | awk '{print $1}')
最后补充一下,shell命令中我们也可以定义一个数组,这样命令会看起来比较简洁,而且更符合编程的思维方式,数组的基本定义方法如下:
$ a=(2b0ec8efa4be 748878eee02f 877fd6a284e9 284dc5e69c47 11a7637d9ae2 48dbf0299a05 8bda2f0ac60b 070cbde1af97 9d79e086b6a1 97d80ebb05d2 c6e7b715dfcc ee0e70ae7dc2)
$ sudo docker rm $a
2b0ec8efa4be
748878eee02f
877fd6a284e9
284dc5e69c47
11a7637d9ae2
48dbf0299a05
8bda2f0ac60b
070cbde1af97
9d79e086b6a1
97d80ebb05d2
c6e7b715dfcc
ee0e70ae7dc2
Shell命令非常的强大,这也是为什么那么多人喜欢用linux作为服务器的原因之一。
网友评论