Acceda al registro de contenedores de Google sin el cliente gcloud


Tengo un host de docker CoreOS en el que quiero comenzar a ejecutar contenedores, pero cuando intento usar el comando docker para obtener la imagen del registro privado de contenedores de Google ( https://cloud.google.com/tools/container-registry / ), obtengo un 403. Hice algunas búsquedas, pero no estoy seguro de cómo adjuntar la autenticación (o dónde generar el paquete user+pass para usar con el comando docker login).

¿Alguien ha tenido suerte tirando de los contenedores privados de Google? Me no se puede instalar el comando gcloud porque coreos no viene con python, que es un requisito

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

Actualización : después de recibir respuestas de @mattmoor y @Jesse:

La máquina de la que estoy sacando tiene 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

Además, intenté usar el método de inicio de sesión _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 [email protected] -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
Author: Andre, 2015-03-27

6 answers

El esquema de autenticación del Registro de Contenedores de Google es simplemente usar:

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

En Google Compute Engine puedes iniciar sesión sin gcloud con:

$ 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

Update on {asia,eu,us, b}.gcr.io

Para acceder a un repositorio alojado en un repositorio localizado, debe iniciar sesión en el nombre de host apropiado en el comando docker login anterior.

Actualización sobre citas alrededor de _token

A partir de la versión 1.8 de docker, el inicio de sesión de docker requiere la opción-u estar en qoutes o empezar con una letra.

Algunos consejos de diagnóstico...

Compruebe que tiene el ámbito de almacenamiento en la nube a través de:

$ 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
...

NOTA: "docker pull" requiere "read_only", pero" docker push "requiere"read_write".

Para dar a este robot acceso a un cubo en otro proyecto, hay unos pocos pasos.

Primero, averigüe la identidad de la cuenta de servicio de VM (también conocida como robot) a través de:

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

A continuación, hay tres ACLs importantes para actualizar:

1) Bucket ACL (necesario para listar objetos, etc.)

PROJECT_ID=correct-answer-42
[email protected]
gsutil acl ch -u $ROBOT:R gs://artifacts.$PROJECT_ID.appspot.com

2) Bucket Default ACL (plantilla para el futuro #3)

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

3) ACLs de objetos (solo se necesitan cuando el cubo no está vacío)

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

Parte de por qué esto no está en nuestra documentación oficial todavía es que queremos una mejor historia de alto nivel para ello, pero tl;dr respetamos las ACLs de GCS.

 43
Author: mattmoor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-11 21:31:56

Las respuestas aquí tratan sobre el acceso a docker desde una instancia de Google Compute Engine.

Si desea trabajar con el Registro de Contenedores de Google en una máquina que no esté en el Motor de Cómputo de Google (es decir, local) utilizando vanilla docker, puede seguir las instrucciones de Google.

Los dos métodos principales utilizan un token de acceso o un archivo de clave JSON.

Tenga en cuenta que _token y _json_key son los valores reales que proporciona para el nombre de usuario (-u)

Token de acceso

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

Archivo de clave JSON

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

Para crear un archivo de clave puede seguir estas instrucciones:

  1. Abra la página de credenciales.
  2. Para configurar una nueva cuenta de servicio, haga lo siguiente:
    • Haga clic en Agregar credenciales > Cuenta de servicio.
    • Elija si desea descargar la clave pública / privada de la cuenta de servicio como un archivo P12 estándar o como un archivo JSON que puede cargar una API de Google biblioteca de clientes.
    • Su nuevo par de claves pública/privada se genera y se descarga en su máquina; sirve como la única copia de esta clave. Usted es responsable de almacenarlo de forma segura.

Puede ver la documentación de Google sobre la generación de un archivo de clave aquí.

 17
Author: anthonator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-18 04:21:28

Hay dos formas oficiales :

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

Nota: El e-mail no se usa, así que puedes poner lo que quieras en él.

Cambie gcr.ioa cualquier dominio que se muestre en su Registro de Contenedores de Google (por ejemplo, eu.gcr.io).

La opción (1) solo da un token temporal, por lo que probablemente desee option (2). Para obtener eso $JSON_KEY:

  1. Vaya a Administrador de API > Credenciales
  2. Haga clic en " Crear credenciales " > Clave de cuenta de servicio:
    • Cuenta de servicio: Nueva cuenta de servicio
      • Nombre: Cualquier cosa que quieras, como Docker Registry (read-only)
      • Rol: Almacenamiento (desplácese hacia abajo) > Visor de objetos de almacenamiento
    • Tipo de clave: JSON
  3. Descargar como keyfile.json
  4. JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
  5. Ahora puedes usarlo.

Una vez conectado, puede ejecutar docker pull. También puede copiar el ~/.dockercfg actualizado para preservar el configuración.

 3
Author: Wernight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-31 14:27:14

Cuando creó su VM, ¿le dio los alcances necesarios para poder leer desde el registro?

Gcloud compute instances crear INSTANCIA \ --ámbitos https://www.googleapis.com/auth/devstorage.read_write

Si lo hizo, no se requiere autenticación adicional.

 0
Author: Jesse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-29 15:44:37

Hay un plugin oficial de Autenticación del Registro de Contenedores de Google publicado. Le invitamos a probarlo y dejar comentarios / informar problemas.

 0
Author: Wei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-27 17:28:04

He desarrollado un plugin jenkins que permite a un esclavo que se ejecuta en GCE para iniciar sesión en el registro de Google utilizando la solución de @mattmoor. Podría ser útil para otros. :)

Está disponible en https://github.com/Byclosure/gcr.io-login-plugin .

 -1
Author: Pedro Ribeiro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-12 15:44:08