Реестр контейнеров 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, никогда не вызывается. Понятия не имею почему. Жаль, это казалось намного более чистым решением. Тем не менее, процедурный код выше работает для меня.