Назад | Перейти на главную страницу

Удалите изображение докера в реестре, удалив файлы / папки на сервере

У меня следующая проблема с удалением изображения или тега в docker-registry v2:

У меня есть сервер, на котором работает докер-реестр. Я создал изображение и подтолкнул его, что теперь хочу исчезнуть. Теперь я хочу удалить изображение (или хотя бы тег, если изображение невозможно).

Текущая версия внешнего интерфейса не поддерживает такую ​​функциональность.

Я пробовал через curl -u MY_USERNAME -X DELETE MY_DOMAIN:PORT/v2/IMAGE_NAME/manifests/REFERENCE команда, как и HTTP API reference состояния и ввел пароль, но в результате была пустая строка, не было ошибки аутентификации (аутентификация активирована) или сообщение об успешном завершении. Тег все еще доступен.

Поскольку у меня есть доступ к серверу, мне пришла в голову следующая идея: можно ли просто и безопасно удалить папку v2/repositories/IMAGE_NAME/_manifests/tags/VERSION (или другой файл / папка)? Или это приводит к поломке реестра? Какие начальные шаги, например, остановить службу реестра, мне нужно сделать?

Да, они не упростили это, и это все еще не идеально, но API реестра v2 теперь имеет возможность удалять изображения.

Можно просто и безопасно удалить папку v2 / repositories / IMAGE_NAME / _manifests / tags / VERSION

Фактические данные изображения хранятся в каталоге BLOB-объектов на диске, но они используются разными манифестами, поэтому небезопасно просто очищать этот каталог, если вы не учли все изображения, которые могут совместно использовать BLOB-объекты.

Вот способ удалить изображение с помощью API докеров v2:

Во-первых, в вашем реестре должна быть включена функция DELETE. Либо установите env var:

REGISTRY_STORAGE_DELETE_ENABLED: "true"

или в config.yml нужно установить

storage:
  delete:
    enabled: true

Затем запустите удаление через вызовы API (Вы можете легко протестировать через Postman или просто используя curl / etc)

НОТА: В приведенных ниже вызовах добавьте "Accept: application/vnd.docker.distribution.manifest.v2+json" в заголовок HTTP

  1. Собираем дайджест изображений:

    HEAD https://myprivateregistry:5001/v2/<image_name>/manifests/<image_tag>

    Этот вызов возвращает ключ заголовка Docker-Content-Digest с таким значением: sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

  2. Используя это значение из шага 2, запустите DELETE http звонок:

    DELETE https://myprivateregistry:5001/v2/<image_name>/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

    API возвращает 202 Accepted

  3. Запустите сборку мусора вручную, если вы не хотите ждать следующего запуска по расписанию: registry garbage-collect /etc/docker/registry/config.yml

    Пример при запуске реестра как контейнера: docker exec -t registry-test ./bin/registry garbage-collect /etc/docker/registry/config.yml

    Сборщик мусора удаляет связанные большие двоичные объекты и манифестирует с диска за вас.

На этом этапе тег image: полностью удаляется с диска и удаляется из реестра. Капли будут удалены, и вы увидите, что манифесты исчезли из v2/repositories/<image_name>/_manifests

ПРИМЕЧАНИЕ: Если это было последнее изображение в вашем репо, вам все равно придется вручную удалить список репо с диска (v2/repositories/<image_name>/_layers) - однако это всего лишь метаданные. Фактические данные изображения уже удалены. Я считаю, что это может быть ошибка в сборщике мусора. У меня есть вопрос по этому поводу: Docker Private Registry - удалены все образы, но все еще отображаются в каталоге

БОЛЬШЕ ДЕТАЛЕЙ:

https://docs.docker.com/registry/spec/api/#deleting-an-image https://jsosic.wordpress.com/2017/01/23/deleting-images-from-docker-registry/