zl程序教程

您现在的位置是:首页 >  Javascript

当前栏目

一键删除docker-compose镜像和容器

2023-04-18 16:28:33 时间

方式1:删除docker下的所有容器和镜像

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images -q)

方式2:当发布的时候分成多个 docker-compose.yml文件时,比如有系统支撑的mysql、redis、rabbitmq等的基础脚本docker-base目录,还有springboot分布式架构的docker-eureka、docker-feign、docker-hystrix,如下:

[root@localhost docker]# find . -name docker-compose.yml
./docker-base/docker-compose.yml
./docker-eureka/docker-compose.yml
./docker-feign/docker-compose.yml
./docker-hystrix/docker-compose.yml

这样分开的目的是方便发布与升级,我只需要重新删除指定的模块即可,其他的不用动。这时就可以用到如下脚本一键删掉指定模块的容器和镜像,创建clean.sh文件,然后录入以下内容:

#! /bin/bash

#找出docker-compose.yml 文件中的 镜像名称
grep -ai 'image' docker-compose.yml| awk '{ gsub (" ", "", $0);sub(/:/,"|");sub(/ $/,""); print}' > tmp.1.txt
#查询所有容器的镜像名称和ID
docker ps -a --format "table {{.Image}}|{{.ID}}"|grep -v ID > tmp.2.txt
#通过上面两个临时文件,找出docker-compose.yml 文件中的镜像名称对应的容器ID
awk -F'|' 'NR==FNR{Z[$2]=$2}NR>FNR{if(Z[$1]!=""){print Z[$1]","$2}}' tmp.1.txt tmp.2.txt|awk -F',' '{print $2}' > result.1.txt
#根据ID停止容器
docker stop $(cat result.1.txt)
#根据ID删除容器
docker rm $(cat result.1.txt)

#找出所有镜像名称
docker images|grep -v IMAGE|awk '{print $1"|"$3}' > tmp.3.txt
#通过两个临时文件找出docker-compose.yml 文件中的镜像名称对应的镜像ID
awk -F'|' 'NR==FNR{a[$2]=$0}NR>FNR&&a[b=$1]{print $0, a[b]}' tmp.1.txt tmp.3.txt|awk -F'|' '{print $2}'|awk '{print $1}' > result.2.txt
#根据ID删除镜像
docker rmi $(cat result.2.txt)

#删除所有使用的临时文件
rm -rf result.2.txt result.1.txt tmp.3.txt tmp.2.txt tmp.1.txt