如何使用码头图像过滤器

我会写作

docker images --filter "dangling=true"

我还能用什么过滤器?

我可以用这样的东西吗?

docker images --filter "running=false"
115396 次浏览

Docker v1.13.0支持以下条件:

  -f, --filter value    Filter output based on conditions provided (default [])
- dangling=(true|false)
- label=<key> or label=<key>=<value>
- before=(<image-name>[:tag]|<image-id>|<image@digest>)
- since=(<image-name>[:tag]|<image-id>|<image@digest>)
- reference=(pattern of an image reference)

或者使用 grep按一定值对图像进行过滤:

$ docker images | grep somevalue

参考文献

在 Docker v1.7中:

目前支援的过滤器包括:

  • 悬挂(布尔值 -truefalse)
  • 标签(label=<key>label=<key>=<value>)

对我来说,

docker images -q | while read IMAGE_ID; do
docker inspect --format='\{\{.Created}}' --type=image ${IMAGE_ID}
done

Date 命令能够通过以下方式生成相同格式的输出

date -Ins --date='10 weeks ago'

这样我就可以比较时间戳了。不过为了方便起见,我还是使用了悬挂图像的过滤器。

Sudo docker images —— filter“ running = false”

清理旧容器时,你可以使用:
docker container prune

要删除未标记的图像,可以使用:
docker image prune

您还可以使用 REPOSITORY参数到 docker images来过滤图像。

例如,假设我们有图像:

$ docker images
REPOSITORY           TAG          IMAGE ID         CREATED         SIZE
local-foo            latest       17864104b328     2 months ago    100 MB
example.com/bar      latest       b94c37de2801     9 months ago    285 MB
example.com/baz      latest       a004e3ac682c     2 years ago     221 MB

我们可以显式过滤所有具有给定名称的图像:

$ docker images example.com/bar
REPOSITORY           TAG          IMAGE ID         CREATED         SIZE
example.com/bar      latest       b94c37de2801     9 months ago    285 MB

Docker 还支持 globbing:

$ docker images "example.com/*"
REPOSITORY           TAG          IMAGE ID         CREATED         SIZE
example.com/bar      latest       b94c37de2801     9 months ago    285 MB
example.com/baz      latest       a004e3ac682c     2 years ago     221 MB

官方文件。

还有另一个例子,可用于17.09 + + 版本:

sudo docker rmi $(sudo docker images -f=reference="registry.gitlab.com/example-app" -f "dangling=true" -q)

说明:

  • reference-我们正在引用图像的存储库名称;
  • dangling=true-我们正在删除未标记的图像;
  • -q-表示安静,只显示图像的数字 ID,而不是整行。

此命令删除所有具有存储库名称“ registry.gitlab.com/example-app”且未标记的映像(在标记列中包含 <none>)

参考链接: https://docs.docker.com/engine/reference/commandline/images/#filtering

仅供参考,没有滤镜,但是当你用于测试或学习时,删除所有图像,

Docker 图像 rm-f $(docker 图像 ls)

你好。

要添加到原来的答案关于如何使用图像过滤器,只是添加一个类似的情况下的用例。

我的 CI 流水线重新构建了 docker,每次都用 最后一次提交编号标记它们,并将它们发送到 docker 存储库。

但是,这会导致 CI 构建机器上出现残留的、未使用的/不需要的映像。 作为后期步骤,我需要把它们全部清理干净,即使是刚刚构建的那些,但同时,我想让我的基本下载的图像(比如 OpenJDK,PostGre)不被删除,以避免每次下载

  1. Add a/any label in Docker file ( unique and is not expected to be contained in my base images)

LABEL built=XYZ

  1. 使用图像过滤器,只是为了得到我创建的图像的图像标识符

docker images --quiet --filter label=built=XYZ

  1. 作为后期构建操作删除它们

docker rmi -f $(docker images --quiet --filter label=built=XYZ)

在 Powershell,可以用这个例子:

docker images --format "\{\{.Repository}}:\{\{.Tag}}" | findstr "some_name"

要删除图像,您可以将这个命令与 delete 命令组合起来,如下所示:

docker rmi $(docker images --format "\{\{.Repository}}:\{\{.Tag}}"|findstr "some_name")

我想要找到一个匹配的本地图像和图像的标记与远程回购(例如下面的 My-repo.example.com)。

比如说,

docker images
REPOSITORY                                       TAG       IMAGE ID       CREATED        SIZE
my-good-app                                    latest    9a8742ad82d3   24 hours ago   126MB
my-repo.example.com/mine/my-good-app           latest    9a8742ad82d3   24 hours ago   126MB
my-repo.example.com/mine/demo-docker           latest    c10baf5231a1   2 weeks ago    200MB

I got tired of trying to figure out how filtering worked, so I just fell back to what I knew.

docker images | grep my-good-app  | awk '{print $3}' | uniq

这将匹配具有模式 my-good-app的任何图像名称。我不能得到其他答案包括这两个(图像没有回购和图像重命名像 my-repo.example.com在我的例子)。

然后,为了删除上面匹配的图像,我运行:

docker rmi -f $(docker images | grep my-good-app  | awk '{print $3}' | uniq)

Docker 内置的过滤功能对于某些用例来说并不适用。主要是,通球模式不匹配正斜杠使得不可能匹配不共享相同数量正斜杠的图像。

我发现使用 awk 这样的外部工具更容易。例如,这里我从一个特定的存储库中提取/更新所有的图像,以及用任何 SNAPSHOT 版本标记的它的子目录:

docker images --filter=since=65f20cac3aa5 | awk '$1~repo && $2~tag { print $1 ":" $2}' repo=my.repo.com/subdirectory tag=SNAPSHOT | xargs -r -L 1 docker pull

注意,我将它与内置的过滤器“ since”组合在一起。