Доступ к реестру контейнеров 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
Ответы
Ответ 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
Если вы этого не сделали, дальнейшая проверка подлинности не требуется.
Ответ 5
Опубликован официальный "Плагин для регистрации в Google Контейнере" . Вы можете попробовать и оставить отзыв/сообщить о проблемах.
Ответ 6
Я разработал плагин jenkins, который позволяет ведомому, работающему на GCE, войти в реестр Google с помощью решения @mattmoor. Это может быть полезно для других.:)
Он доступен в https://github.com/Byclosure/gcr.io-login-plugin.