Docker images 默认按仓库名、标签、镜像ID字典序排序,不支持内置排序;需用--format配合awk/sort(Linux/macOS)或JSON+ConvertFrom-Json(Windows)实现按大小或时间倒序。

docker images 默认排序不符合需求
默认 docker images 输出既不按大小升序/降序,也不按创建时间排序,而是按仓库名、标签、镜像 ID 字典序排——这在排查大镜像或清理陈旧镜像时完全没用。
根本原因是 Docker CLI 本身不支持 --sort 这类参数(和 docker ps 不同),必须靠外部工具二次处理。
- Linux/macOS 下用
sort+awk是最轻量、最可靠的方式 - Windows PowerShell 用户需注意字段对齐问题,
docker images的列宽不固定,直接切列易出错 - 别用
docker images --format配合sort:虽然能输出 JSON 或 Go template,但Created字段是字符串(如2 weeks ago),无法直接比较时间
按镜像大小倒序排列(从大到小)
大小信息在 docker images 输出的第 4 列(REPOSITORY 后是 TAG,再后是 IMAGE ID,然后是 CREATED,最后是 SIZE),但列数不稳定——带 <none></none> 标签的镜像会少一列。稳妥做法是用 awk 按字段名定位 SIZE 列索引。
实操命令:
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}\t{{.Size}}" | awk 'NR==1 {for(i=1;i<=NF;i++) if($i=="SIZE") col=i; print; next} {print $0 | "sort -k" col "hr"}'
-
--format强制输出制表符分隔,避免空格干扰 -
awk先扫首行找SIZE列号,再对后续行按该列数值逆序(-hr:human-readable 数值排序,支持1.2GB、456MB) - 注意:
sort -h在 macOS 的 BSDsort中不可用,得装gsort(viabrew install coreutils)
按创建时间倒序(最新创建的在前)
CreatedAt 字段在 --format 中是 ISO8601 时间戳(如 2024-03-15 14:22:03 +0800 CST),可直接字典序排序,但要注意时区字符可能破坏对齐。更稳的方式是用 docker image inspect 提取 Created 字段(UTC 时间戳)。
快速按时间排序(推荐):
docker images --format '{{.ID}} {{.Repository}}:{{.Tag}} {{.CreatedSince}}' | sort -k3,3r
-
{{.CreatedSince}}是相对字符串(如3 hours ago),不能精确比,但用于“大致先后”够用 - 要精确到秒,必须用
inspect+jq:docker images -q | xargs -r docker image inspect --format '{{.Id}} {{.RepoTags}} {{.Created}}' | sort -k3,3r -
xargs -r防止没有镜像时报错;sort -k3,3r表示按第 3 字段逆序,因.Created是 ISO 时间,字典序即时间序
Windows PowerShell 下避坑要点
PowerShell 原生不兼容 docker images 的空格分隔输出,ConvertFrom-String 或 -split 极易错位,尤其遇到 <none> 镜像或带空格的仓库名时。
- 唯一靠谱路径:改用
docker images --format输出 JSON,再用ConvertFrom-Json - 例如:
docker images --format "{{json .}}" | ConvertFrom-Json | Sort-Object -Property Size -Descending——但注意Size是字符串("1.24GB"),需先转数字,否则排序失效 - 真正省事的做法:在 WSL2 里执行 Linux 命令,比在 PowerShell 里硬刚格式强得多
大小和时间排序都依赖字段提取的稳定性,而 docker images 的文本输出本质是给人看的,不是为解析设计的——这点最容易被忽略。










