Доступ к реестру контейнера Google без клиента gcloud

У меня есть докер-хост CoreOS, на котором я хочу запустить контейнеры, но при попытке использовать команду docker для загрузки изображения из частного реестра контейнера Google ( https://cloud.google.com/tools/container-registry/), Я получаю 403. Я провел некоторый поиск, но я не уверен, как подключить аутентификацию (или где генерировать пакет user+pass для использования с командой входа в docker).

У кого-нибудь была удача вытащить из гугл приватных контейнеров? Я не могу установить команду gcloud, потому что coreos не поставляется с python, что является обязательным требованием

docker run -p 80:80 gcr.io/prj_name/image_name
Unable to find image 'gcr.io/prj_name/image_name:latest' locally
Pulling repository gcr.io/prj_name/image_name
FATA[0000] HTTP code: 403

Обновление: после получения ответов от @mattmoor и @Jesse:

У машины, из которой я тяну, есть потеря

curl -H 'Metadata-Flavor: Google' http://metadata.google.internal./computeMetadata/v1/instance/service-accounts/default/scopes
https://www.googleapis.com/auth/bigquery
https://www.googleapis.com/auth/cloud-platform
https://www.googleapis.com/auth/compute
https://www.googleapis.com/auth/datastore
----> https://www.googleapis.com/auth/devstorage.read_only
https://www.googleapis.com/auth/logging.admin
https://www.googleapis.com/auth/sqlservice.admin
https://www.googleapis.com/auth/taskqueue
https://www.googleapis.com/auth/userinfo.email

Кроме того, я попытался использовать метод входа _token

jenkins@riskjenkins:/home/andre$ ACCESS_TOKEN=$(curl -H 'Metadata-Flavor: Google' 'http://metadata.google.internal./computeMetadata/v1/instance/service-accounts/default/token' | cut -d'"' -f 4)
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   142  100   142    0     0  14686      0 --:--:-- --:--:-- --:--:-- 15777
jenkins@riskjenkins:/home/andre$ echo $ACCESS_TOKEN
**************(redacted, but looks valid)
jenkins@riskjenkins:/home/andre$ docker login -e not@val.id -u _token -p $ACCESS_TOKEN http://gcr.io
Login Succeeded
jenkins@riskjenkins:/home/andre$ docker run gcr.io/prj_name/image_name
Unable to find image 'gcr.io/prj_name/image_name:latest' locally
Pulling repository gcr.io/prj_name/image_name
FATA[0000] HTTP code: 403

6 ответов

Решение

Схема аутентификации реестра Google Container заключается в простом использовании:

username: '_token'
password: {oauth access token}

В Google Compute Engine вы можете войти без gcloud с помощью:

$ METADATA=http://metadata.google.internal./computeMetadata/v1
$ SVC_ACCT=$METADATA/instance/service-accounts/default
$ ACCESS_TOKEN=$(curl -H 'Metadata-Flavor: Google' $SVC_ACCT/token \
    | cut -d'"' -f 4)
$ docker login -e not@val.id -u '_token' -p $ACCESS_TOKEN https://gcr.io

Обновление {Азия, ЕС, США,b}.gcr.io

Чтобы получить доступ к репозиторию, размещенному в локализованном репозитории, вы должны авторизоваться на соответствующем имени хоста, указанном выше. docker login команда.

Обновление цитат вокруг _token

Начиная с версии 1.8 для Docker, для входа в Docker требуется, чтобы опция -u была в qoutes или начиналась с буквы.

Некоторые диагностические советы...

Проверьте наличие облачного хранилища с помощью:

$ curl -H 'Metadata-Flavor: Google' $SVC_ACCT/scopes
...
https://www.googleapis.com/auth/devstorage.full_control
https://www.googleapis.com/auth/devstorage.read_write
https://www.googleapis.com/auth/devstorage.read_only
...

ПРИМЕЧАНИЕ:"Docker Pull" требует "read_only", но "Docker Push" требует "read_write".

Чтобы дать этому роботу доступ к корзине в другом проекте, есть несколько шагов.

Во-первых, узнайте личность учетной записи службы VM (он же робот) через:

$ curl -H 'Metadata-Flavor: Google' $SVC_ACCT/email
1234567890@developer.gserviceaccount.com

Далее необходимо обновить три важных ACL:

1) Bucket ACL (необходим для перечисления объектов и т. Д.)

PROJECT_ID=correct-answer-42
ROBOT=1234567890@developer.gserviceaccount.com
gsutil acl ch -u $ROBOT:R gs://artifacts.$PROJECT_ID.appspot.com

2) Bucket Default ACL (шаблон для будущего № 3)

gsutil defacl ch -u $ROBOT:R gs://artifacts.$PROJECT_ID.appspot.com

3) ACL-объекты (нужны только в том случае, если корзина не пуста)

gsutil -m acl ch -R -u $ROBOT:R gs://artifacts.$PROJECT_ID.appspot.com

Часть того, чего нет в нашей официальной документации, заключается в том, что мы хотим получить более качественную историю, но мы уважаем ACL GCS.

Ответы здесь касаются доступа к докеру из экземпляра Google Compute Engine.

Если вы хотите работать с Реестром контейнеров Google на компьютере, не входящем в Google Compute Engine (то есть локально), с помощью Vanilla Docker, вы можете следовать инструкциям Google.

Два основных метода используют токен доступа или файл ключа JSON.

Обратите внимание, что _token а также _json_key фактические значения, которые вы указываете для имени пользователя ( -u )

Токен доступа

$ docker login -e 1234@5678.com -u _token -p "$(gcloud auth print-access-token)" https://gcr.io

Файл ключа JSON

$ docker login -e 1234@5678.com -u _json_key -p "$(cat keyfile.json)" https://gcr.io

Для создания файла ключа вы можете следовать этим инструкциям:

  1. Откройте страницу учетных данных.
  2. Чтобы настроить новую учетную запись службы, выполните следующие действия.
    • Нажмите Добавить учетные данные> Сервисная учетная запись.
    • Выберите, загружать ли открытый / закрытый ключ учетной записи службы как стандартный файл P12 или как файл JSON, который может быть загружен клиентской библиотекой API Google.
    • Ваша новая пара открытых / закрытых ключей генерируется и загружается на ваш компьютер; он служит единственной копией этого ключа. Вы несете ответственность за его надежное хранение.

Вы можете просмотреть документацию Google по созданию файла ключа здесь.

Есть два официальных способа:

  1. $ docker login -e 1234@5678.com -u oauth2accesstoken -p "$(gcloud auth print-access-token)" https://gcr.io
  2. $ docker login -e 1234@5678.com -u _json_key -p "$JSON_KEY" https://gcr.io

Примечание. Электронная почта не используется, поэтому вы можете поместить в нее все, что захотите.

+ Изменить gcr.io к тому, что ваш домен отображается в вашем реестре контейнеров Google (например, eu.gcr.io).

Опция (1) дает только временный токен, поэтому вам, вероятно, нужен вариант (2). Чтобы получить это $JSON_KEY:

  1. Перейдите в API Manager > Учетные данные
  2. Нажмите "Создать учетные данные"> Ключ учетной записи службы:
    • Сервисный аккаунт: новый сервисный аккаунт
      • Имя: все, что вы хотите, как Docker Registry (read-only)
      • Роль: Хранилище (прокрутите вниз) > Средство просмотра хранилища
    • Тип ключа: JSON
  3. Скачать как keyfile.json
  4. JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
  5. Теперь вы можете использовать его.

После входа в систему вы можете просто запустить docker pull, Вы также можете скопировать обновленное ~/.dockercfg сохранить настройки.

Когда вы создали свою виртуальную машину, вы предоставили ей необходимые объемы для чтения из реестра?

экземпляры gcloud compute создают INSTANCE \ --scopes https://www.googleapis.com/auth/devstorage.read_write

Если вы это сделали, дальнейшая аутентификация не требуется.

Опубликован официальный плагин аутентификации реестра контейнеров Google. Вы можете попробовать и оставить отзыв / сообщить о проблемах.

Я разработал плагин jenkins, который позволяет подчиненному, работающему на GCE, войти в реестр Google, используя решение @mattmoor. Это может быть полезно для других.:)

Он доступен по адресу https://github.com/Byclosure/gcr.io-login-plugin.

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