Подтвердить что ты не робот

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

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

Неужели кому-нибудь удавалось вытащить из личных контейнеров Google? Я не могу установить команду 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:

Машина, с которой я выхожу, имеет devaccess

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

[email protected]:/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
[email protected]:/home/andre$ echo $ACCESS_TOKEN
**************(redacted, but looks valid)
[email protected]:/home/andre$ docker login -e [email protected] -u _token -p $ACCESS_TOKEN http://gcr.io
Login Succeeded
[email protected]:/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
4b9b3361

Ответ 1

Схема проверки подлинности в Google Контейнере используется просто:

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 [email protected] -u '_token' -p $ACCESS_TOKEN https://gcr.io

Обновление по {asia, eu, us, b}.gcr.io

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

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

Как и докер версии 1.8, для входа в докер требуется, чтобы опция -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 (aka robot) с помощью:

$ curl -H 'Metadata-Flavor: Google' $SVC_ACCT/email
[email protected]

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

1) Bucket ACL (необходимо для отображения объектов и т.д.)

PROJECT_ID=correct-answer-42
[email protected]
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

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

Ответ 2

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

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

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

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

Ток доступа

$ docker login -e [email protected] -u _token -p "$(gcloud auth print-access-token)" https://gcr.io

Файл ключа JSON

$ docker login -e [email protected] -u _json_key -p "$(cat keyfile.json)" https://gcr.io

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

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

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

Ответ 3

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

  • $ docker login -e [email protected] -u oauth2accesstoken -p "$(gcloud auth print-access-token)" https://gcr.io
  • $ docker login -e [email protected] -u _json_key -p "$JSON_KEY" https://gcr.io

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

Измените gcr.io на все, что показано в вашем домене Google Container Registry (например, eu.gcr.io).

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

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

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

Ответ 4

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

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

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

Ответ 6

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

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