我有 3 个容器,但我有很多图像,如图所示。
⚡️ docker 图像
REPOSITORY TAG IMAGE ID CREATED SIZE
sscportalsmb_smb-portal latest ad0854c799f6 12 days ago 17.6MB
bheng_web latest d5a0ea011c0a 2 weeks ago 182MB
<none> <none> 957c22ababec 2 weeks ago 182MB
docker_web latest 70b443ed0495 2 weeks ago 182MB
bheng_app latest 509d58a68224 2 weeks ago 756MB
docker_app latest 509d58a68224 2 weeks ago 756MB
mysql 5.6 96dc914914f5 2 weeks ago 299MB
sscportalapi_ssc-portal-api latest e8295f9cb5f1 4 weeks ago 160MB
sscportaladmin_admin-portal latest fd141ceba4d6 4 weeks ago 17.7MB
mysql latest 5fac85ee2c68 5 weeks ago 408MB
redis latest 1fb7b6c8c0d0 6 weeks ago 107MB
alpine 3.6 76da55c8019d 2 months ago 3.97MB
keymetrics/pm2-docker-alpine 6 4a09bfc067d6 4 months ago 75.3MB
andrewmclagan/nginx-hhvm latest ec6cc741eb0e 7 months ago 580MB
nginx 1.10 0346349a1a64 7 months ago 182MB
tutum/haproxy latest 33bc771bec1e 17 months ago 232MB
php 7.0.4-fpm 81d7a2fdc6dc 20 months ago 494MB
我不确定这是否正常。
如何检查我不使用的图像并相应地删除它们?
以上答案帮助我们找到并删除悬空图像,但并未未使用。
因此要获取机器上所有未使用的 docker 镜像
获取属于正在运行的容器的所有镜像(未停止或退出)
获取机器上的所有图像
然后从步骤2过滤步骤1中的图像
下面是基本的 shell 脚本,可以帮助做到这一点
runningImages=$(docker ps --format {{.Image}})
docker images --format {{.Repository}}:{{.Tag}} | grep -v "$runningImages"
在删除未使用的图像(不是悬空的图像)之前,请确保将它们列出,然后决定手动删除哪一个。
您可以使用以下命令查找未使用的图像:
docker images -f dangling=true
以及他们的 ID 列表:
docker images -q -f dangling=true
如果您想删除它们:
docker rmi $(docker images -q -f dangling=true)
不久前,Docker 为此添加了特殊命令:
docker image prune
-> https://docs.docker.com/engine/reference/commandline/image_prune/ 用于删除未使用的图像和 docker container prune
-> https://docs.docker.com/engine/reference/ commandline/container_prune/ 用于停止的容器。
docker image prune
docker image prune
仅删除 dangling
没有任何基于它们的容器的图像。
检查受影响图像的脚本:
runningImages=$(docker ps -a --format "< {{.Image}} >" && docker ps -a --format "< {{.Image}}:latest >") # Latter command is to include images without any tags determined
if [ -z "$runningImages" ]; then # Necessary when no container is running
runningImages="< >"
fi
docker images -f dangling=true --format 'table < {{.Repository}}:{{.Tag}} >\t< {{.ID}} >\t' | grep -v "$runningImages"
docker image prune -a
docker image prune -a
删除 all 没有任何基于它们的容器的图像。
检查受影响图像的脚本:
runningImages=$(docker ps -a --format "< {{.Image}} >" && docker ps -a --format "< {{.Image}}:latest >") # Latter command is to include images without any tags determined
if [ -z "$runningImages" ]; then # Necessary when no container is running
runningImages="< >"
fi
docker images --format 'table < {{.Repository}}:{{.Tag}} >\t< {{.ID}} >\t' | grep -v "$runningImages"
(它对
@GPuri
的答案进行了一些改进和修复,例如,列出所有容器中的图像,不仅是正在运行的容器,而且由 < >
包围,以确保搜索整个短语,并检查由图像的 ID
创建的容器而不是 name:tag
。)
比较
docker images
和 docker ps
的结果,您应该能够了解正在运行的容器中使用了哪些图像。 docker ps
输出的第二列确实是使用的图像。