zoukankan      html  css  js  c++  java
  • awk在删除镜像过程中的用法及说明

    引自:https://segmentfault.com/a/1190000005821733

    用途:可以同时删除同一个镜像下所有的容器

    看到一篇“Docker 技巧:删除 Docker 容器和镜像”其中提到删除标签为none的镜像的方法,其中用到了awk,就去查了下,下面举例说明:

    docker rmi $(docker images | awk '$1 == "<none>" && $2 == "<none>" {print $3}')

    很多挺长的指令不明白的时候可以拆成短的去学习了解,这里 “$()” 中的语句可以单摘出来:

    docker images | awk '$1 == "<none>" && $2 == "<none>" {print $3}'

    这条语句又可以看作两步操作:

    1. docker images:查询本地镜像列表;

    2. awk:文本分析工具,这里的 “'$1 == "<none>" && $2 == "<none>" {print $3}'” 是它的判断条件和具体操作;

    为了方便理解,这里再简化下语句:

    docker images | awk '{print $0}'
    # 返回结果:
    REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
    mono/jexus              6.24                1972cdc31613        4 days ago          727.9 MB
    

    然后将结果与下面的两个语句进行对比

    docker images | awk '{print $1}'
    # 返回结果:
    REPOSITORY
    mono/jexus
    
    docker images | awk '{print $3}'
    # 返回结果:
    IMAGE
    1972cdc31613
    

    不难看出 “$” 后的参数分别对应的结果是有规律的。实际上,awk认为文本文件都是结构化的,它将每一个输入行定义为一个记录,行中的每个字符串定义为一个域(段),域和域之间使用分割符分割。awk会把每行进行一个拆分,用相应的命令对拆分出来的“段”进行处理。

    • 行工作模式,读入文件的每一行,会把一行的内容,存到$0里;

    • 使用内置的变量FS(段的分隔符,默认用的是空白字符),分割这一行,把分割出来的每个段存到相应的变量$(1-100);

    • 输出的时候按照内置变量OFS(out FS);

    • 读入下一行继续操作;

    '$1 == "<none>" && $2 == "<none>" {print $3}'中的$1 == "<none>" && $2 == "<none>"含义则是每行拆分出的第一个字段和第二字段均为 “<none>”,那么就执行{print $3},即输出该行记录中的镜像ID。我们这里是要删除名称和标签均为none的镜像,那么只能通过docker rmi ImageID来删除镜像,所以最后无需输出整行记录,只需输出镜像的id即可,而镜像id处在一行记录拆分后的第三个,即$3,所以这里用{print $3}即可。然后组合起来就是:

    docker rmi $(docker images | awk '$1 == "<none>" && $2 == "<none>" {print $3}')

    通过awk可以得到想要的文本,再与docker的其他命令组合可以实现很多有意思的功能,关于awk更多的信息请参考《Shell脚本之awk详解》,这里是备份。关于Docker的相关指令可以参照《Docker的学习--命令使用详解》,里面有详尽的注释。

    另外,如果需要几个命令组合就可以用$()将命令嵌套起来,如:

    # 查询本地镜像的ID列表
    docker images -q

    # 根据镜像的ID或镜像的名称 + 标签删除镜像
    docker rmi ImageID

    组合之后就成了

    # 删除所有的镜像
    docker rmi $(docker images -q)

    同样的,你可以根据自己的情况将其他的命令进行组合,同时用awk对文本进行处理可以实现更多有意思的功能。还有就是如果对docker的命令不熟悉的话

    # 查看命令的帮助信息
    docker COMMAND --help
    # 例如:
    docker rmi --help
    # 返回结果
    Usage:  docker rmi [OPTIONS] IMAGE [IMAGE...]
    
    Remove one or more images
    
      -f, --force        Force removal of the image
      --help             Print usage
      --no-prune         Do not delete untagged parents

    这里没办法列全所有的用法,也没必要,如果你自己掌握用法既可以记得牢,也可以自己组合出自己需要的命令。

    参考文献:

  • 相关阅读:
    2019.2.18接口
    第一阶段复习
    vue-cli使用介绍
    Webpack 入门教程
    js报错Uncaught TypeError: Cannot read property 'getElementsByTagName' of null
    用shell编程.编写一个程序,用循环创建多个目录 并在该目录下创建多个文件 在文件中写入内容:
    explorer.exe应用程序错误,怎么解决?
    [Java连接MySQL数据库——含详细步骤和代码](https://www.cnblogs.com/town123/p/8336244.html)
    墨刀的简单使用
    laravel报错:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0' for key 'PRIMARY...
  • 原文地址:https://www.cnblogs.com/xxj-bigshow/p/9089208.html
Copyright © 2011-2022 走看看