Следующее возвращает все изображения + тег, кроме самого последнего:
comm -23 \
<(docker images --format='{{ .Repository }}:{{ .Tag }}' | sort) \
<(docker images --format='{{ .Repository }},{{ .CreatedAt }},{{ .Tag }}' | \
sort | \
awk -F',' 'NR>1{arr[$1]=$1":"$3} END{for (a in arr) print arr[a]}' | \
sort)
(я думаю, это можно сократить, но это то, что я использую на Linux машинах)
Пояснения
Первый параметр comm
- это команда:
docker images --format='{{ .Repository }}:{{ .Tag }}' | sort
, возвращающая список отсортированных изображений, например:
alpine:3.10
alpine:3.11
alpine:3.8
debian:stretch
debian:buster
[...]
Второй параметр comm
также является командой, возвращающей для каждого изображения (.Repository
) самый последний созданный тег (на основе атрибута .CreatedAt
):
docker images --format='{{ .Repository }},{{ .CreatedAt }},{{ .Tag }}' | \
sort | \
awk -F',' 'NR>1{m[$1]=$1":"$3} END{for(a in m) print arr[m]}'
m
- карта и содержимое перезаписывается для каждой строки, поэтому конечным результатом является самое последнее изображение (так как вход отсортирован).
Пример:
alpine:3.11
debian:buster
comm -23
в основном говорит: make различие между первой командой (все отсортированные изображения) и второй командой (последнее созданное изображение для каждого изображения) и возвращает только изображения, возвращенные первой командой (то есть не последнее созданное изображение для каждого изображения).
Если вы согласны с результатами (изображения, которые будет удален), вы можете добавить | xargs docker rmi
после этой команды, чтобы автоматически удалять эти изображения (я не включал эту часть в команду в начале, потому что я уверен, что некоторые люди скопировали бы команду без проверки ее работы первый).