Очистить дубликаты версий docker изображений - PullRequest
0 голосов
/ 21 февраля 2020

У меня maaaaany docker images, занимающих место.

Среди них много дубликатов (различающихся по тегам, которые являются версиями одного и того же). Например,

my-image-name  d5c0a632266fbb32d3864c9dbf52b11ebdb03885    79584dff1249    11 months ago  575MB
my-image-name  04cd5a4ab3ebfec48a5fe66e2f6ae0520209b294    e7049365408e    11 months ago  575MB
my-image-name  3e050a876a7bed2df0f0bb2c4da5cdba75de1ca5    b04345c45d85    11 months ago  575MB
my-image-name  d97f04bbad9900af897cd54dc2b1c02ce0c06454    0e9fd34d9bf6    11 months ago  575MB
my-image-name  e03151317d6b199cbfd8a93a7dbb2a868ed77536    1e1b112a4d79    11 months ago  575MB

Мой метод очистки:

alias dockerclean='docker images -f '\''dangling=true'\'' -q | xargs docker rmi && docker ps -f '\''status=exited'\'' -q | xargs docker rm'

И когда я чувствую себя агрессивно

docker system prune --volumes

Кто-нибудь знает способ очистки дубликатов, таких как как эти? Дополнительные баллы, если я могу сохранить самый последний.

PS Я не хочу называть их вручную, например что-то вроде docker images | grep my-image-name | awk '{print $1 ":" $2}' | xargs docker rmi

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Следующее возвращает все изображения + тег, кроме самого последнего:

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 после этой команды, чтобы автоматически удалять эти изображения (я не включал эту часть в команду в начале, потому что я уверен, что некоторые люди скопировали бы команду без проверки ее работы первый).

0 голосов
/ 25 февраля 2020

Это справочное приложение для полезности замечательного ответа @norbjd, потому что он не go хорошо в комментарии.

Псевдоним go для инициализации оболочки (~ / .zshr c):

dockerrmiold() {
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) | \
        grep -v "<none>:<none>" | \
        xargs docker rmi
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...