美文网首页数据分析
Shell小技巧——如何有选择的清理docker容器

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

作者: koala_A | 来源:发表于2020-04-30 20:41 被阅读0次

    今天放假,终于有时间好好整整升级到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作为服务器的原因之一。

    相关文章

      网友评论

        本文标题:Shell小技巧——如何有选择的清理docker容器

        本文链接:https://www.haomeiwen.com/subject/rrpqghtx.html