webentwicklung-frage-antwort-db.com.de

Greifen Sie auf die Google Container-Registrierung ohne den gcloud-Client zu

Ich habe einen CoreOS-Docker-Host, auf dem ich Container ausführen möchte, aber beim Versuch, den Docker-Befehl zum Abrufen des Bildes aus der privaten Registry des Google-Container zu verwenden ( https://cloud.google.com/tools/container- registry/ ), ich bekomme eine 403. Ich habe etwas gesucht, aber ich bin mir nicht sicher, wie ich die Authentifizierung anfügen soll (oder wo man das Benutzer + Pass-Paket für den Docker-Login-Befehl generiert).

Hat jemand Glück, sich aus den privaten Google-Containern zu ziehen? Ich kann den Befehl gcloud nicht installieren, da Coreos nicht mit Python geliefert wird. Dies ist eine Voraussetzung

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

Update: Nachdem Sie Antworten von @mattmoor und @Jesse erhalten haben: 

Die Maschine, von der ich abziehe, hat einen 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

Außerdem habe ich versucht, die Anmeldemethode _token zu verwenden

[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
28
Andre

Das Authentifizierungsschema der Google Container-Registrierung ist einfach zu verwenden:

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

Auf der Google Compute Engine können Sie sich mit ohne gcloud anmelden:

$ 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 auf {asia, eu, us, b} .gcr.io

Um auf ein Repository zuzugreifen, das in einem lokalisierten Repository gehostet wird, müssen Sie sich beim obigen docker login-Befehl beim entsprechenden Hostnamen anmelden.

Update auf Anführungszeichen um _token

Ab der Docker-Version 1.8 muss für die Docker-Anmeldung die Option -u in qoutes stehen oder mit einem Buchstaben beginnen.

Einige Diagnosetipps ...

Überprüfen Sie, ob Sie über den Cloud-Speicherbereich verfügen:

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

HINWEIS: "Docker Pull" erfordert "read_only", aber "Docker Push" erfordert "Read_write".

Um diesem Roboter Zugriff auf einen Bucket in einem anderen Projekt zu gewähren, gibt es einige Schritte.

Ermitteln Sie zunächst die Identität des VM - Dienstkontos (auch bekannt als Roboter):

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

Als Nächstes müssen drei wichtige ACLs aktualisiert werden:

1) Bucket-ACL (zum Auflisten von Objekten usw. erforderlich)

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

2) Bucket Default ACL (Vorlage für zukünftige Nummer 3)

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

3) Objekt-ACLs (nur erforderlich, wenn der Bucket nicht leer ist)

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

Ein Grund, warum dies in unserer offiziellen Dokumentation noch nicht enthalten ist, ist, dass wir eine bessere Story auf hoher Ebene wünschen, aber wir respektieren die GCS-ACLs.

44
mattmoor

Die Antworten beziehen sich auf den Zugriff auf das Docker aus einer Google Compute Engine-Instanz.

Wenn Sie mit der Google Container Registry auf einem Computer arbeiten möchten, der nicht in der Google Compute Engine (d. H. Lokal) mit Vanilla Docker arbeitet, können Sie den Anweisungen von Google folgen .

Die zwei Hauptmethoden verwenden ein Zugriffstoken oder eine JSON-Schlüsseldatei.

Beachten Sie, dass _token und _json_key die tatsächlichen Werte sind, die Sie für den Benutzernamen angeben (-u).

Zugangstoken

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

JSON-Schlüsseldatei

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

Um eine Schlüsseldatei zu erstellen, folgen Sie diesen Anweisungen:

  1. Öffnen Sie die Seite "Anmeldeinformationen".
  2. Gehen Sie wie folgt vor, um ein neues Dienstkonto einzurichten:
    • Klicken Sie auf Anmeldeinformationen hinzufügen> Dienstkonto.
    • Wählen Sie aus, ob Sie den öffentlichen/privaten Schlüssel des Dienstkontos als Standard-P12-Datei oder als JSON-Datei herunterladen möchten, die von einer Google API-Clientbibliothek geladen werden kann.
    • Ihr neues öffentliches/privates Schlüsselpaar wird generiert und auf Ihren Computer heruntergeladen. es dient als einzige Kopie dieses Schlüssels. Sie sind für die sichere Aufbewahrung verantwortlich.

Sie können die Dokumentation von Google zum Erstellen einer Schlüsseldatei hier anzeigen.

18
anthonator

Es gibt zwei offizielle Wege :

  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

Hinweis: Die E-Mail wird nicht verwendet, sodass Sie alles darin ablegen können, was Sie möchten.

Ändern Sie gcr.io In die Domain, die in Ihrer Google Container Registry (z. B. eu.gcr.io) Angezeigt wird.

Option (1) gibt nur ein temporäres Token aus, daher möchten Sie wahrscheinlich Option (2). So erhalten Sie $JSON_KEY:

  1. Gehen Sie zu API Manager> Credentials
  2. Klicken Sie auf "Anmeldeinformationen erstellen"> Dienstkontoschlüssel :
    • Dienstkonto: Neues Dienstkonto
      • Name: Alles was Sie wollen, wie Docker Registry (read-only)
      • Rolle: Speicher (Bildlauf nach unten)> Speicherobjektanzeige
    • Schlüsseltyp: [~ # ~] json [~ # ~]
  3. Herunterladen als keyfile.json
  4. JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
  5. Jetzt kannst du es benutzen.

Sobald Sie eingeloggt sind, können Sie einfach docker pull Ausführen. Sie können auch den aktualisierten ~/.dockercfg Kopieren, um die Einstellungen beizubehalten.

5
Wernight

Haben Sie bei der Erstellung Ihres VM die erforderlichen Bereiche angegeben, um aus der Registrierung lesen zu können?

gcloud-Berechnungsinstanzen erstellen INSTANCE\ --scopes https://www.googleapis.com/auth/devstorage.read_write

Wenn Sie dies tun, ist keine weitere Authentifizierung erforderlich.

1
Jesse

Es ist ein offizielles Google Container Registry Auth Plugin veröffentlicht. Sie können es gerne ausprobieren und Feedback hinterlassen/Probleme melden.

0
Wei