如何检查 docker 容器是否有未使用的镜像?

问题描述 投票:0回答:5

我有 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 docker-compose dockerfile dockerhub docker-image
5个回答
13
投票

以上答案帮助我们找到并删除悬空图像,但并未未使用。

因此要获取机器上所有未使用的 docker 镜像

  1. 获取属于正在运行的容器的所有镜像(未停止或退出)

  2. 获取机器上的所有图像

  3. 然后从步骤2过滤步骤1中的图像

下面是基本的 shell 脚本,可以帮助做到这一点

runningImages=$(docker ps --format {{.Image}})
docker images --format {{.Repository}}:{{.Tag}} | grep -v "$runningImages"

在删除未使用的图像(不是悬空的图像)之前,请确保将它们列出,然后决定手动删除哪一个。


8
投票

您可以使用以下命令查找未使用的图像:

docker images -f dangling=true

以及他们的 ID 列表:

docker images -q -f dangling=true

如果您想删除它们:

docker rmi $(docker images -q -f dangling=true)

4
投票

不久前,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/ 用于停止的容器。


1
投票

使用前检查
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
。)


0
投票

比较

docker images
docker ps
的结果,您应该能够了解正在运行的容器中使用了哪些图像。
docker ps
输出的第二列确实是使用的图像。

© www.soinside.com 2019 - 2024. All rights reserved.