2015-03-27 16 views
24

Ho un host docker CoreOS su cui voglio avviare i container, ma quando provo a usare il comando docker per recuperare l'immagine dal registro privato del contenitore google (https://cloud.google.com/tools/container-registry/), ottengo a 403. Ho effettuato alcune ricerche, ma non sono sicuro di come collegare l'autenticazione (o dove generare l'utente + passare il pacchetto da utilizzare con il comando di login della finestra mobile).Accedi al registro contenitore google senza il client gcloud

Qualcuno ha avuto fortuna tirando dai contenitori privati ​​di Google? Non riesco a installare il comando gcloud perché CoreOS non arriva con python, che è 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 

Aggiornamento: dopo aver ricevuto risposte da @mattmoor e @Jesse:

La macchina che ho 'm tirando da ha 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 

Inoltre, ho provato ad utilizzare il metodo di login _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 

risposta

41

Lo schema di autenticazione di Google Container Registro di sistema è di usare semplicemente:

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

Su Google Compute Engine è possibile accedere senza 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 

Aggiornamento su {Asia, UE, Stati Uniti , b} .gcr.io

Per accedere a un repository ospitato in un repository localizzato, è necessario accedere all'ap proprio nome host nel comando docker login precedente.

Aggiornamento sulle virgolette _token

partire dalla finestra mobile versione 1.8, Portuale login richiede l'opzione -u per essere in qoutes o iniziare con una lettera.

Alcuni consigli diagnostici ...

Verificare di avere l'ambito Cloud Storage tramite:

$ 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: "finestra mobile pull" richiede "read_only", ma "finestra mobile premere "richiede" read_write ".

Per dare a questo robot l'accesso a un secchio in un altro progetto, ci sono alcuni passaggi.

primo luogo, scoprire l'account di servizio VM (aka robot) s 'identità tramite:

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

Avanti, ci sono tre ACL importante aggiornare:

1) Secchio ACL (necessaria alla lista oggetti, ecc)

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

2) Secchio di default ACL (modello per il futuro # 3)

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

ACL 3) Object (necessarie solo se il secchio è non vuota)

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

Parte del motivo per cui questo non è nel nostro documentazione ufficiale ancora è che vogliamo una migliore storia di alto livello per esso , ma noi rispettiamo gli ACL GCS.

+0

Questo sembra promettente, gli darò un'inquadratura domani – Andre

+0

FWIW, richiediamo che l'ambito di lettura GCS funzioni correttamente. Puoi controllare con: curl -H 'Metadata-Flavor: Google' http: //metadata.google.internal./ computeMetadata/v1/istanza/account di servizio /default/scope – mattmoor

+0

L'istanza GCE ha funzionalità di sola lettura di tipo devstorage e sebbene l'accesso sia riuscito, non è stato possibile estrarre l'immagine. Ho modificato la domanda originale con i miei tentativi sia per i tuoi che per i suggerimenti di @ Jesse. Fammi sapere se hai altri suggerimenti – Andre

0

Quando hai creato la tua macchina virtuale gli hai dato gli ambiti necessari per poter leggere dal registro?

casi gcloud calcolo Crea istanza \ --scopes https://www.googleapis.com/auth/devstorage.read_write

Se avete quindi non sono richieste ulteriori di autenticazione.

+2

Non penso che sia vero, perché "Se questo flag non viene fornito, vengono utilizzati i seguenti ambiti: https://www.googleapis.com/auth/devstorage.read_only, https://www.googleapis.com/auth /logging.write "Sto prelevando dal repository, quindi read_only dovrebbe essere sufficiente, ma ottengo comunque un 403 – Andre

-1

Ho sviluppato un plugin jenkins che consente a uno slave in esecuzione su GCE di accedere al registro di google utilizzando la soluzione di @ mattmoor. Potrebbe essere utile agli altri. :)

È disponibile allo https://github.com/Byclosure/gcr.io-login-plugin.

+0

Si prega di non postare solo le risposte di link in quanto i collegamenti potrebbero interrompersi – NathanOliver

0

C'è un annuncio ufficiale Google Container Registry Auth Plugin pubblicato. Siete invitati a provarlo e lasciare feedback/segnalare problemi.

+0

Grazie, proverò. Sono stato in grado di ottenere uno stato abbastanza buono accedendo a entrambi gli endpoint https: // gcr e http: // gcr con i token di accesso. Per qualche motivo, dovevo effettuare il login sia su – Andre

+0

@Andre: stai utilizzando il plugin di autenticazione del registro di Google Container con il plug-in Docker Build Step o un altro plug-in? Sono anche un po 'confuso dalla tua affermazione "logging in entrambi gli endpoint gcr e gcr". Puoi chiarire? Se si utilizza il plug-in Docker Build Step con il plug-in GCR auth, è necessario aggiungere le credenziali fornite per ogni singolo comando Passo generazione Docker. – Wei

12

Le risposte qui trattano l'accesso alla finestra mobile dall'interno di un'istanza di Google Compute Engine.

Se si desidera lavorare con il registro dei contenitori di Google su una macchina non presente nel motore di Google Compute (ad esempio locale) utilizzando la finestra mobile vaniglia è possibile eseguire follow Google's instructions.

I due metodi principali utilizzano un token di accesso o un file di chiave JSON.

noti che _token e _json_key sono i valori effettivi forniti per il nome utente (-u)

token di accesso

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

JSON file chiave

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

Per creare un file chiave è possibile seguire queste istruzioni:

  1. Aprire la pagina delle credenziali.
  2. Per configurare un nuovo account di servizio, effettuare le seguenti operazioni:
    • Fare clic su Aggiungi credenziali> account servizio.
    • Scegliere se scaricare la chiave pubblica/privata dell'account di servizio come file P12 standard o come file JSON che può essere caricato da una libreria client dell'API di Google.
    • La nuova coppia di chiavi pubblica/privata viene generata e scaricata sul dispositivo; serve come unica copia di questa chiave. Sei responsabile per la memorizzazione in modo sicuro.

È possibile view Google's documentation on generating a key file here.

+0

questa risposta che mi hai fornito mi ha dato qualche speranza di riuscire a far funzionare le cose, dopo aver scaricato un giorno o più scolo cercando di fare qualcosa di così semplice come spingere un'immagine al repository, ma ancora senza fortuna. – the0ther

+0

L'ho fatto !!! Penso che parte del problema sia che gcr.io è così simile a grc.com, il sito web di Steve Gibson/Security Now. Probabilmente si è scritto così tante volte. Quando finalmente ho capito bene, il Token di accesso ha funzionato per me. – the0ther

3

ci sono two official ways:

  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: L'e-mail non viene utilizzato, in modo da poter mettere quello che vuoi in esso.

Modificare gcr.io in qualsiasi dominio mostrato nel proprio Google Container Registry (ad esempio eu.gcr.io).

L'opzione (1) fornisce solo un token temporaneo, quindi probabilmente si desidera l'opzione (2). Per ottenere che $JSON_KEY:

  1. Vai API Manager > Credentials
  2. Fare clic su "Create credenziali"> conto Servizio tasto:
    • account di servizio: conto Nuovo servizio
      • nome: Tutto quello che vuoi , come Docker Registry (read-only)
      • Ruolo: Archiviazione (scorrere verso il basso)>bagagli Object Viewer
    • Tipo chiave: JSON
  3. Scarica come keyfile.json
  4. JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
  5. Ora è possibile utilizzarlo.

Una volta effettuato l'accesso, è possibile eseguire solo docker pull. È inoltre possibile copiare il ~/.dockercfg aggiornato per conservare le impostazioni.