如何使用docker图像过滤器

mon*_*lls 65 docker

我可以写

docker images --filter "dangling=true"
Run Code Online (Sandbox Code Playgroud)

我可以使用哪些其他过滤器?

我可以用这样的东西吗?

docker images --filter "running=false"
Run Code Online (Sandbox Code Playgroud)

stu*_*udy 66

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)
Run Code Online (Sandbox Code Playgroud)

或者用于grep按某些值过滤图像:

$ docker images | grep somevalue
Run Code Online (Sandbox Code Playgroud)

参考

  • 与记住这些语法相比,使用 [jq](https://stedolan.github.io/jq/) 的 json 会容易得多。如 `docker image ls --format="{{json .}}" | jq '选择( (.Tag=="最新") 或 (.Tag="&lt;none&gt;"))'`。您可以将 `--format="{{json .}}"` 与其他 docker ls 命令一起使用。 (8认同)
  • 请更新您的答案 - 目前,截至2017年2月,它支持更多的参数. (5认同)
  • 我们如何通过存储库名称排除某些图像? (4认同)
  • 它不是完美的,但是使用上面的代码,您可以执行类似docker images -f“ reference = * / * / * latest”的操作-这将使您获得类似于“ k8s:30000 / github / someImage:latest”的信息。 。或`docker images -f“ reference = * / * latest”`会得到k8s:30000 / someImage:latest`。如果您想清理它们-`docker rmi $(docker images -f“ reference = * / * / * latest” -q --no-trunc)` (2认同)

Wil*_*hes 29

您还可以使用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
Run Code Online (Sandbox Code Playgroud)

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

$ docker images example.com/bar
REPOSITORY           TAG          IMAGE ID         CREATED         SIZE
example.com/bar      latest       b94c37de2801     9 months ago    285 MB
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

官方文档在这里.

  • 一直以来,我一直在寻找“--filter name=something” - 一直以来,简单的解决方案是您根本不需要(n显式)过滤器! (3认同)
  • 请注意,“ *”通配符不适用于存储库名称中的“ /”。因此,在最后一个示例中,要列出所有带有标签“ latest”的图像,命令“ docker images --filter = reference ='*:latest'”是错误的。正确的命令是`docker images --filter = reference ='* / *:latest'`。 (2认同)
  • 对于那些仍然困惑的人...如果您正在寻找图像“openapitools/openapi-generator-cli”,那么“docker images open*”将找不到它。但是 `docker images open*/*` 会找到它。 (2认同)

Ert*_*oğa 12

在Docker v1.7中:

目前支持的过滤器是:

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


Pat*_*atS 7

我想要找到本地图像和用远程存储库标记的图像的匹配项(下面示例中的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
Run Code Online (Sandbox Code Playgroud)

我厌倦了试图弄清楚过滤是如何工作的,所以我只是回到我所知道的。

docker images | grep my-good-app  | awk '{print $3}' | uniq
Run Code Online (Sandbox Code Playgroud)

这将匹配任何具有模式的图像名称my-good-app。我无法得到包含两者的其他答案(没有存储库的图像和带有存储库名称的图像,如my-repo.example.com我的示例中所示)。

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

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


小智 6

为了我,

docker images -q | while read IMAGE_ID; do
    docker inspect --format='{{.Created}}' --type=image ${IMAGE_ID}
done
Run Code Online (Sandbox Code Playgroud)

做了伎俩.date命令可以通过相同的格式生成输出

date -Ins --date='10 weeks ago'
Run Code Online (Sandbox Code Playgroud)

这允许我比较时间戳.不过,为了方便,我仍然使用滤镜来悬挂图像.


wsc*_*rge 6

如果您正在寻找基于创建日期和存储库/标签删除映像的解决方案,则 Docker CLI 缺乏适当的过滤

  1. docker image prune--since确实通过和标志接受时间戳--until(例如:--until=24h),但不允许通过存储库/标签进行过滤。
  2. docker images并且docker image ls接受存储库/标签过滤器(例如--filter=reference='registry.gitlab.com/group/*/*:)但不接受时间戳 - 仅接受--since和中的其他图像ID --before(例如--since=586026f10754

我写了一篇(七行)单行文字来满足我认为的常见需求:根据存储库和创建日期删除图像。干得好:

docker image rm $(docker images \
--filter=reference='registry.gitlab.com/group/*/*/*:*' \
--format "{{.ID}}-{{.CreatedAt}}'" | \
cut -d " " -f 1 | \
sed 's/-/ /'| \
awk -v date="$(date --date='3 days ago' +%Y-%m-%d)" '$NF < date' \
cut -d " " -f 1)
Run Code Online (Sandbox Code Playgroud)

定制:

要求:bashawkcutsed显然docker