Доступ к реестру контейнера 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
Для создания файла ключа вы можете следовать этим инструкциям:
- Откройте страницу учетных данных.
- Чтобы настроить новую учетную запись службы, выполните следующие действия.
- Нажмите Добавить учетные данные> Сервисная учетная запись.
- Выберите, загружать ли открытый / закрытый ключ учетной записи службы как стандартный файл P12 или как файл JSON, который может быть загружен клиентской библиотекой API Google.
- Ваша новая пара открытых / закрытых ключей генерируется и загружается на ваш компьютер; он служит единственной копией этого ключа. Вы несете ответственность за его надежное хранение.
Вы можете просмотреть документацию Google по созданию файла ключа здесь.
Есть два официальных способа:
$ docker login -e 1234@5678.com -u oauth2accesstoken -p "$(gcloud auth print-access-token)" https://gcr.io
$ 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
:
- Перейдите в API Manager > Учетные данные
- Нажмите "Создать учетные данные"> Ключ учетной записи службы:
- Сервисный аккаунт: новый сервисный аккаунт
- Имя: все, что вы хотите, как
Docker Registry (read-only)
- Роль: Хранилище (прокрутите вниз) > Средство просмотра хранилища
- Имя: все, что вы хотите, как
- Тип ключа: JSON
- Сервисный аккаунт: новый сервисный аккаунт
- Скачать как
keyfile.json
JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
- Теперь вы можете использовать его.
После входа в систему вы можете просто запустить 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.