По умолчанию werf использует Docker Registry API и для большинства container registries от пользователя никаких дополнительных действий не требуется.

Тем не менее container registry может поддерживать Docker Registry API не полностью и/или реализовывать часть функций в нативном API. В таком случае, при работе с container registry от пользователя могут потребоваться дополнительные действия и данные.

Используя заданный адрес репозитория (опция --repo) werf пытается автоматически определить container registry. Пользователь может явно указать container registry, используя опцию --repo-container-registry или переменную окружения WERF_REPO_CONTAINER_REGISTRY.

  Сборка Бандлы Очистка
AWS ECR ок ок *ок
Azure CR ок ок *ок
Default ок ок ок
Docker Hub ок не поддерживается *ок
GCR ок ок ок
GitHub Packages (docker.pkg.github.com) ок не поддерживается *ок
GitHub Packages (ghcr.io) ок ок не поддерживается
GitLab Registry ок ок *ок
Harbor ок ок ок
JFrog Artifactory ок ок ок
Nexus ок не проверялся ок
Quay ок не поддерживается ок
Yandex Container Registry ок не проверялся ок

Авторизация

При работе с container registry команды werf используют данные хранящиеся в конфигурации Docker. По умолчанию используется пользовательская директория ~/.docker или альтернативный путь, заданный переменной окружения WERF_DOCKER_CONFIG или DOCKER_CONFIG.

Конфигурация Docker — это директория, в которой хранятся данные авторизации, используемые для доступа в различные container registries, а также настройки Docker

Для авторизации можно использовать команду docker login, oras login или нативные решения container registry.

В рамках CI-заданий рекомендуется использовать команду werf ci-env, которая создаёт временную конфигурацию Docker на базе пользовательской, а также выполняет авторизацию (при использовании container registry CI), используя переменные окружения CI. Подробнее о подключении werf к CI-системам в соответствующем разделе.

Использование общей конфигурации Docker при параллельном выполнении заданий в CI-системе может приводить к падениям из-за временных доступов и состояния race condition (одно задание влияет на другое, переопределяя доступы в общей конфигурации Docker), поэтому для каждого CI-задания мы рекомендуем создавать собственную конфигурацию Docker (команда werf ci-env делает это по умолчанию)

Бандлы

Для работы с бандлами достаточно поддержки спецификации формата образов Open Container Initiative (OCI) в container registry.

Очистка

По умолчанию при удалении тегов werf использует Docker Registry API и от пользователя требуется только авторизация с использованием доступов с достаточным набором прав.

Если удаление посредством Docker Registry API не поддерживается и оно реализуется в нативном API, то от пользователя потребуется выполнить специфичные для container registry действия.

AWS ECR

При удалении тегов werf использует AWS SDK, поэтому перед очисткой container registry необходимо выполнить одно из следующих действий:

Azure CR

При удалении тегов werf использует Azure CLI, поэтому перед очисткой container registry необходимо выполнить следующие действия:

  • Установить Azure CLI (az).
  • Выполнить авторизацию (az login).

Пользователю необходимо иметь одну из следующих ролей: Owner, Contributor или AcrDelete (подробнее Azure CR roles and permissions)

Docker Hub

При удалении тегов werf использует Docker Hub API, поэтому при очистке container registry необходимо определить token или username и password.

Для получения token можно использовать следующий скрипт:

HUB_USERNAME=username
HUB_PASSWORD=password
HUB_TOKEN=$(curl -s -H "Content-Type: application/json" -X POST -d '{"username": "'${HUB_USERNAME}'", "password": "'${HUB_PASSWORD}'"}' https://hub.docker.com/v2/users/login/ | jq -r .token)

В качестве token нельзя использовать personal access token, т.к. удаление ресурсов возможно только при использовании основных учётных данных пользователя

Для того, чтобы задать параметры, следует использовать следующие опции или соответствующие им переменные окружения:

  • --repo-docker-hub-token или
  • --repo-docker-hub-username и --repo-docker-hub-password.

GitHub Packages (docker.pkg.github.com)

При удалении тегов werf использует GitHub GraphQL API, поэтому при очистке container registry необходимо определить token с read:packages, write:packages, delete:packages и repo scopes.

GitHub не поддерживает удаление версий package в публичных репозиториях

Для того, чтобы задать параметры, следует использовать опцию --repo-github-token или соответствующую переменную окружения.

GitLab Registry

При удалении тегов werf использует GitLab Container Registry API или Docker Registry API в зависимости от версии GitLab.

Для удаления тега прав временного токена CI-задания ($CI_JOB_TOKEN) недостаточно, поэтому пользователю необходимо создать специальный токен в разделе Access Token (в секции Scope необходимо выбрать api) и выполнить авторизацию с ним