数据分析

Shell小技巧——如何有选择的清理docker容器

2020-04-30  本文已影响0人  koala_A

今天放假,终于有时间好好整整升级到Rancher2.x的问题了。

整理过程中发现,rancher 的Master节点上还有一大堆rancher1.6的容器在运行


创建时间为16months ago 的部分都是我需要清理的内容,有十几个容器,如果一个个的用docker stop、docker rm命令去清理非常非常的浪费时间,尤其对于我这种喜欢偷懒的人,简直就是噩梦。那么,有什么办法能够快速搞定呢?

数据分析思维

还是结合前面文章提到过的,数据分析的思维方式,从这里面先找到一些特征,然后再想办法用shell命令将符合这些特征的信息筛选出来,这个场景,有两个典型特征:

最直接的想法就是利用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作为服务器的原因之一。

上一篇下一篇

猜你喜欢

热点阅读