docker私有仓库镜像管理,删除7天前本地镜像,删除时间很长的仓库镜像

任务目的

由于公司架构目前都是微服务架构,发布项目全部都是打包成docker镜像包,每次发布过程打包镜像—>镜像打tag—>推送到镜像仓库,这样下来一个镜像就会保存三次,时间长了就会导致镜像过多,占用系统磁盘非常大,半年下来打包构建的磁盘达到900G,本地五千多个镜像,仓库三千多个,所以要定期处理这些镜像
#删除本地镜像
最简单的删除本地镜像就是清空

#docker image purne -a 

但是这样会删掉所有没在使用的镜像,项目服务器上可以,但是发布jenkins的最好保留最近的镜像,下面贴出一个删除七天前镜像的一个脚本

#!/bin/sh
echo >/tmp/run_image_ids.$$
DOCKER_BIN=/usr/bin/docker
LOG=/tmp/docker-cleanup.log
rm /tmp/run_image_ids.$$
echo "$(date) start-----" >>$LOG
$DOCKER_BIN ps --no-trunc -a -q | while read cid; do
running=$($DOCKER_BIN inspect -f '{{.State.Running}}' $cid)
if [ "$running"x = "true"x ]; then
  id=$($DOCKER_BIN inspect -f '{{.Image}}' $cid)
  echo $id >>/tmp/run_image_ids.$$
  continue
fi
fini=$($DOCKER_BIN inspect -f '{{.State.FinishedAt}}' $cid | awk -F. '{print $1}')
diff=$(expr $(date +"%s") - $(date --date="$fini" +"%s"))
#for MacOs
#diff=$(expr $(date +"%s") - $(date -j -f %Y-%m-%dT%H:%M:%S "$fini" +"%s"))
# if [[ $diff -gt 86400*7 ]] 改成这样可以限制时间7if [ $diff -gt 86400 ]; then
  echo "$DOCKER_BIN rm -v $cid >>$LOG 2>&1"
  $DOCKER_BIN rm -v $cid >>$LOG 2>&1
fi
done
$DOCKER_BIN images --no-trunc | grep -v REPOSITORY | while read line; do
sha_num=`echo $line|awk '{print $3}'`
echo $sha_num
repo_tag=$(echo $line | awk '{print $1":"$2}')
image_id=$(echo $line | awk '{print $3}')
echo 1
grep -q $image_id /tmp/run_image_ids.$$
if [ $? -eq 0 ]; then
  continue
fi
creat_time=$(docker inspect -f '{{.Created}}' $sha_num | awk -F. '{print $1}')
echo $creat_time
echo "输出创建时间"
img_diff=$(expr $(date +"%s") - $(date --date="$creat_time" +"%s"))
if [[ $img_diff -gt 86400*7 ]]; then
  if [ "$repo_tag"x = "<none>:<none>"x ]; then
    echo "$DOCKER_BIN rmi $image_id >>$LOG 2>&1"
    echo "删除没有tag 及 name的镜像"
    #echo "5.1"
    $DOCKER_BIN rmi $image_id >>$LOG 2>&1
  else
    echo "$DOCKER_BIN rmi $repo_tag >>$LOG 2>&1 "
    $DOCKER_BIN rmi $repo_tag >>$LOG 2>&1
  fi
fi
done
rm /tmp/run_image_ids.$$
echo "rm /tmp/run_image_ids.$$"
echo "$(date) end-----" >>$LOG

删除完本地镜像就要控制仓库的镜像,线上我用的是nexus搭建的镜像仓库
这个仓库有一个nexus-cli可以来控制管理私有仓库,下面列举一些常用命令

  1. 下载nexus-cli
wget https://s3.eu-west-2.amazonaws.com/nexus-cli/1.0.0-beta/linux/nexus-cli
chmod +x nexus-cli
  1. 配置nexues(服务器地址、docker仓库名称、账号、密码)
#:nexus-cli configure
Enter Nexus Host: http://127.0.0.1:8081
Enter Nexus Repository Name: test
Enter Nexus Username: admin
Enter Nexus Password: xxxxxx
  1. 查看当前仓库中所有镜像
nexus-cli image ls
  1. 查看镜像信息
    #查看某一镜像的所有的tag
nexus-cli image tags -name IMAGE_NAME 

#查看某一镜像详细信息

nexus-cli image info -name IMAGE_NAME -tag TAG
  1. 删除镜像
    #删除指定tag的指定镜像
    nexus-cli image delete -name IMAGE_NAME -tag TAG #删除指定tag的指定镜像
    #仅保留X项tag,其余全部删除
    nexus-cli image delete -name IMAGE_NAME -keep X
    6.上面nexus-cli删除之后并不会清除磁盘空间,需要登陆到网页上创建两个Tasks
    创建tasks
    (1)创建第一个tasks
    delete unused docker manifests and images
    在这里插入图片描述
    在这里插入图片描述

创建完之后执行,执行完上面这个再创建下一个并执行
(2)Compact blob store
执行完第二个磁盘就下来了

总结

如果线上构建不是很频繁或者项目不是很多的话隔一段时间清理一次就可以了,如果线上很频繁可以写成脚本,看情况使用一天,一周,一月的计划任务来自动清理。

参考地址: https://blog.csdn.net/xujiamin0022016/article/details/107288170.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值