Реестр контейнеров Google golang moby аутентификация

Я использую реестр контейнеров Google для размещения своих изображений докера. Я также использую мобильный клиент для golang, чтобы взаимодействовать с ним. Я использую сервисный ключ JSON, который, кажется, отлично работает с RegistryLogin. Текст ответа: Войти успешно. Однако я не знаю, как использовать возвращенный ключ аутентификации с ImagePull. Под настройкой капота RegistryAuth, по-видимому, устанавливается любая строка, переданная в качестве заголовка X-Registry-Auth, Google, похоже, нигде не упоминает об этом.

Я попытался передать возвращенный ключ как RegistryAuth, я попытался запустить RegistryLogin, а затем просто вытянуть без RegistryAuth. Я пробовал base64 кодирование моей конфигурации аутентификации и отправку этого в RegistryAuth. Независимо от того, что я пытаюсь получить, я получаю сообщение "Ошибка ответа от демона: хранилище xxx не найдено: не существует или нет доступа по запросу". Запуск входа в Docker и затем Docker Pull с теми же подробностями работает нормально на Cli. Мой код:

authConfig := types.AuthConfig{
    Username:      "_json_key",
    Password:      string(decodedKey),
    ServerAddress: "https://gcr.io",
}

_, err = engine.Client.RegistryLogin(ctx, authConfig)
if err != nil {
    return err
}

responseBody, err := engine.Client.ImagePull(ctx, image, types.ImagePullOptions{
})
defer responseBody.Close()

if err != nil {
    return err
}

decodedKey - это содержимое файла ключей JSON. Есть идеи, как заставить это работать?

0 ответов

(Я предполагаю, что вы уже поняли это или нашли альтернативный метод, но я документирую это здесь для следующего человека)

Вам нужно маршалировать его в JSON, а затем кодировать в base64. Я не видел этого нигде, кроме кода для док-клиента.

К сожалению, когда я попытался включить github.com/docker/cli/cli/command Я получил эту ошибку из-за того, что каталог vendor в клиентском репозитории включен в исходный путь пакета go:

./gcp.go:73:47: cannot use authc (type "github.com/docker/docker/api/types".AuthConfig)
as type "github.com/docker/cli/vendor/github.com/docker/docker/api/types".AuthConfig
in argument to command.EncodeAuthToBase64

Компилятор Go не распознает, что они одного типа, что раздражает. Но достаточно просто воспроизвести функциональность:

buf, _ = json.Marshal(authConfig)

regauth := base64.URLEncoding.EncodeToString(buf)

pullopts := types.ImagePullOptions{RegistryAuth:regauth}

responseBody, err := engine.Client.ImagePull(ctx, image, pullopts)

...

* ИМХО, лучшая реализация будет иметь тип.RequestPrivilegeFunc в pullopts, который получает access_token поле из http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token на лету. Таким образом, нет необходимости проверять учетные данные приложения. Я сам еще не пробовал.

Надеюсь, это поможет, несмотря на то, что он опоздал на 18 месяцев.:)

Кстати, служба поддержки Google не смогла предоставить какую-либо информацию об этом, и документация по gcr.io и докеру также не дала много информации. Решение состояло в том, чтобы установить клиентскую настройку и затем взломать пользовательскую версию инструмента docker cli, чтобы я мог видеть, что на самом деле происходит.

* РЕДАКТИРОВАТЬ: Итак, я попробовал это, но УДАЛИТЬ PrivilegeFunc Функция, объявленная в PullOptions, никогда не вызывается. Понятия не имею почему. Жаль, это казалось намного более чистым решением. Тем не менее, процедурный код выше работает для меня.

Другие вопросы по тегам