资讯专栏INFORMATION COLUMN

awk删除docker历史镜像

lentoo / 1770人阅读

摘要:初步列了以下方案用实现擅长,通过重定向将的输出传给,处理完后执行系统命令清除镜像。对镜像列表进行去重操作可以以镜像名称为进行去重获取历史镜像要保留最近个镜像清除历史镜像,其实就是保留数据前行,有个内置变量保存当前处理行编号。

背景

虽然对awk早有耳闻,据说是个很强大的工具,但一直没机会去了解和使用,最近碰到一个需求,用awk轻松解决,才真正一窥它的厉害。
需求是这样的,应用每次升级都会构建一个新的容器镜像,时间久了,服务器上会积累很多历史镜像,而且因为镜像本身比较大,磁盘消耗特别快,因此需要写一个脚本定期保留最近N个镜像,清除其余历史镜像。
初步列了以下方案

用java实现(擅长java~~),通过重定向将docker images的输出传给java,java处理完后执行系统命令清除镜像。

用python处理。

用bash处理。

java方案虽然可行,但想想代码量就不小,既要处理字符串,又要调用系统命令,而且把java拿来做这种事,总感觉怪怪的。pass。
python不熟,又懒得去学,学完之后估计很长时间不会再用,下次用的时候还得去学,性价比不高,pass。
最理想的就是bash,正宗的脚本语言,但是否有足够能力处理字符串,需要做技术调研,这时想到了awk。

awk介绍

awk不只是linux的一个工具,由于awk脚本具有编程语言三要素,顺序,循环,判断,awk还是一门编程语言,主要用于数据处理和数据计算。awk对文本进行行扫描,以行为单位进行处理,按照以下逻辑进行处理

pattern { action }
pattern { action }
....

其中pattern是匹配条件,actionpattern匹配后执行的动作。
上面提到awk对文本以行为单位进行处理,读取行后,awk默认以空格为切割符对行进行切割(split)操作并按顺序存放在变量$1$2,$3....中,其中$0表示完整行数据,这些变量可以用于patternaction
举个例子,比如用ps -ef列出目前系统进程

zhengjianfengdeMacBook-Pro:shell asan$ ps -ef
  UID   PID  PPID   C STIME   TTY           TIME CMD
    0     1     0   0 17 418  ??        21:55.75 /sbin/launchd
    0    37     1   0 17 418  ??         1:50.35 /usr/libexec/UserEventAgent (System)
    0    38     1   0 17 418  ??         0:37.59 /usr/sbin/syslogd
    0    40     1   0 17 418  ??         0:14.22 /System/Library/PrivateFrameworks/Uninstall.framework/Resources/uninstalld
    0    41     1   0 17 418  ??         0:09.93 /usr/libexec/kextd
    0    42     1   0 17 418  ??         4:15.97 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/Support/fseventsd
    0    44     1   0 17 418  ??         0:36.08 /opt/cisco/anyconnect/bin/vpnagentd -execv_instance
   55    48     1   0 17 418  ??         0:03.84 /System/Library/CoreServices/appleeventsd --server

如果我们想要打印出第二列PID的值可以这么写

zhengjianfengdeMacBook-Pro:shell asan$ ps -ef|awk "{print $2}"
PID
1
37
38
40
41
42
44
48

如果想要打印PID大于40值可以这么写

zhengjianfengdeMacBook-Pro:shell asan$ ps -ef|awk "$2>40 {print $2}"
PID
41
42
44
48

本文不是awk入门教程,如果想了解更多awk基本用法,可以阅读以下两篇文章:
http://awk.readthedocs.io/en/...
http://www.runoob.com/linux/l...

实现

获取目前系统镜像列表可以通过命令docker images获取,输出格式如下

[root@definesys /]# docker images
REPOSITORY                                                   TAG                 IMAGE ID            CREATED             SIZE
docker.io/xxxxx-authority-ms                                 v1.0.3              02da1a24ac2c        4 days ago          692 MB
docker.io/xxxxx-authority-ms                                 v1.0.2              4a36396f0fea        4 days ago          692 MB
docker.io/xxxxx-uc-user-ms                                   v.1.1.11            6f0db317c7a9        5 days ago          695 MB
docker.io/xxxxx-uc-user-ms                                   v.1.1.10            26983c00bb73        6 days ago          695 MB
docker.io/xxxxx-uc-user-ms                                   v1.1.9              f21d59255405        7 days ago          695 MB

获取镜像列表

第一步就是要先获取系统的镜像列表,也就是对REPOSITORY进行去重操作,awk去重有个经典的写法。

awk "!a[$0]++ {print $0}"

声明一个hash数组a并且以$0即行数据为key,第一次a[$0]值是未定义的(undef)取反后为true输出,++对a[$0]进行赋值,赋值后a[$0]值为1,第二次a[$0]为1,取反后为0,0++还是0不输出。
对镜像列表进行去重操作可以以镜像名称(REPOSITORY)为key进行去重

docker images|awk "!a[$1]++ {print $1}"

获取历史镜像

要保留最近N个镜像清除历史镜像,其实就是保留数据前N行,awk有个内置变量NR保存当前处理行编号。结合第一步获取的镜像名称可以先grep出指定镜像列表,再用awk进行筛选.

docker images|grep $image|awk "NR > 4 {printf "%s:%s:%s
",$1,$2,$3}"

完整脚本

#!/bin/sh
#create by jianfeng.zheng
#group docker images
for image in `docker images|awk "!a[$1]++ {print $1}"`
do
        for m in `docker images|grep $image|awk "NR > 4 {printf "%s:%s:%s
",$1,$2,$3}"`
        do
                id=`echo $m|awk -F ":" "{print $3}"`
                ##do delete
                echo "delete docker== > "$m
        done
done
结语

awk还有很多功能待挖掘,但可以肯定的是,以后Linux上数据处理的工作,首选方案就是awk。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27319.html

相关文章

  • awk删除镜像过程中的用法及说明

    摘要:实际上,认为文本文件都是结构化的,它将每一个输入行定义为一个记录,行中的每个字符串定义为一个域段,域和域之间使用分割符分割。 看到一篇Docker 技巧:删除 Docker 容器和镜像其中提到删除标签为none的镜像的方法,其中用到了awk,就去查了下,下面举例说明: docker rmi $(docker images | awk $1 == && $2 == {print $3...

    lentoo 评论0 收藏0
  • Docker镜像批量清理之道

    摘要:本文从几个方面来清理垃圾。所以根据镜像名删除镜像的效果会更好。删除镜像定时任务脚本注意事项为了加快打包的速度,一般不要太频繁的删除镜像。因为老的镜像中的某些不改变的层,可以作为新的镜像的缓存,从而大大加快构建的速度。 使用jenkins作为打包的工具,主机上的磁盘空间总是被慢慢被占满,直到jenkins无法运行。本文从几个方面来清理docker垃圾。 批量删除已经退出的容器 docke...

    Charlie_Jade 评论0 收藏0
  • 五分钟快速了解Docker

    摘要:核心概念镜像镜像类似于虚拟机镜像。每个镜像包括了一个基本的操作系统环境容器容器类似于一个轻量级的沙箱,利用容器来运行和隔离应用。 这些是我的笔记,都是记录的核心概念和使用方法 showImg(https://segmentfault.com/img/bVbcOnO?w=1354&h=894); 概述 使用docker搭建开发环境将近1年了,自我感觉docker的强大并非如此,不过没有机...

    Tecode 评论0 收藏0
  • docker在centos安装golang操作及部分理解

    摘要:前两天在本地安装了,熟悉了下命令之后,还是忍不住到上进行了一波镜像部署,以下是我的操作步骤和一些想法。但是如果想要将当前目录的文件复制进里头,首先要保证镜像在运行,然后命令中的容器名使用我圈出来的那个名字。 前两天在本地安装了docker,熟悉了下命令之后,还是忍不住到centos上进行了一波golang镜像部署,以下是我的操作步骤和一些想法。准备:一台安装了docker的可联网的ce...

    huaixiaoz 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<