Mit Docker Hub-Images interagieren

Sie können Container-Images aus Docker Hub verwenden, um Ihre Aufgaben in Cloud Build auszuführen. Wenn Ihr Build Images erzeugt, können Sie diese auch an Docker Hub übertragen. Auf dieser Seite wird beschrieben, wie Sie Build-Konfigurationsdateien zum Übertragen und Abrufen von Docker Hub-Images schreiben. Eine Übersicht über alle in einer Build-Konfigurationsdatei verfügbaren Felder finden Sie in der Übersicht über die Build-Konfiguration.

Öffentliche Images aus Docker Hub abrufen

Sie können offizielle Docker-Images, Docker-zertifizierte Images sowie benutzerdefinierte Images abrufen, die in Ihrem Build-Schritt in Docker Hub gespeichert wurden. Geben Sie hierfür im Feld name den Namen des Images an. Cloud Build ruft zuerst das angegebene Image aus Docker Hub ab und verwendet dann das Image, um den Build-Schritt auszuführen.

Im folgenden Beispiel ruft Cloud Build das Docker-Image für maven ab, um den Befehl mvn auszuführen, der in args angegeben ist:

YAML

steps:
- name: "maven"
  args: ["mvn", "--version"]

JSON

{
   "steps": [
      {
         "name": "maven",
         "args": [
            "mvn",
            "--version"
         ]
      }
   ]
}

Docker-Anmeldedaten im Secret Manager speichern

Wenn Sie private Images abrufen sowie öffentliche und private Images in Docker Hub hochladen möchten, muss sich Cloud Build mit Ihren Anmeldedaten bei Docker authentifizieren. Wenn Sie Docker-Anmeldedaten in Ihre Builds aufnehmen möchten, müssen Sie zuerst Ihre Anmeldedaten im Secret Manager speichern und dann Cloud Build die Berechtigung für den Zugriff auf das Secret vom Secret Manager erteilen.

So speichern Sie Docker-Anmeldedaten im Secret Manager:

  1. Rufen Sie in der Google Cloud Console die Seite "Secret Manager" auf:

    Zur Seite „Secret Manager“

  2. Klicken Sie auf der Seite Secret Manager auf Secret erstellen.

  3. Geben Sie auf der Seite Secret erstellen unter Name den Wert docker-username ein.

  4. Geben Sie im Feld Secret-Wert Ihren Docker-Nutzernamen ein.

  5. Lassen Sie den Abschnitt Regionen unverändert.

  6. Klicken Sie auf Secret erstellen.

Wiederholen Sie die obigen Schritte, um Ihr Docker-Passwort im Secret Manager zu speichern.

So weisen Sie dem Cloud Build-Dienstkonto die IAM-Rolle Zugriffsperson für Secret Manager-Secret für das Secret zu:

  1. Öffnen Sie in der Google Cloud Console die Seite „Secret Manager“:

    Zur Seite „Secret Manager“

  2. Klicken Sie auf das Kästchen des Secrets, das Ihrem Docker-Nutzernamen und dem Passwort entspricht.

  3. Falls das Fenster noch nicht geöffnet ist, klicken Sie auf Infofeld ansehen, um es zu öffnen.

  4. Klicken Sie im Steuerfeld unter Berechtigungen auf Hauptkonto hinzufügen.

  5. Geben Sie in das Textfeld Neue Hauptkonten die E-Mail-Adresse Ihres Cloud Build-Dienstkontos in der Form PROJECT_NUMBER@cloudbuild.gserviceaccount.com ein, wobei PROJECT_NUMBER die Projektnummer des Projekts ist, in dem Sie Builds ausführen. Sie finden die Projektnummer auf der Seite mit den Projekteinstellungen.

  6. Wählen Sie im Drop-down-Menü Rolle auswählen die Rolle Zugriffsperson für Secret Manager-Secret aus.

  7. Klicken Sie auf Speichern.

Private Images aus Docker Hub abrufen

So rufen Sie private Images aus Docker Hub ab:

  1. Achten Sie darauf, dass Sie Ihre Docker-Anmeldedaten im Secret Manager gespeichert und Cloud Build Zugriff auf das Secret gewährt haben.

  2. In der Build-Konfigurationsdatei:

    • Fügen Sie nach allen Build-steps ein Feld availableSecrets hinzu, das die Secret-Version und die Umgebungsvariable für den Docker-Nutzernamen und das Passwort angibt.
    • Geben Sie im Build-Schritt, in dem Sie den Nutzernamen und das Passwort angeben möchten, Folgendes ein:
      • Fügen Sie das Feld entrypoint hinzu, das auf bash verweist, um das Bash-Tool im Build-Schritt zu verwenden. Dies ist erforderlich, um auf die Umgebungsvariable für das Secret zu verweisen.
      • Fügen Sie das Feld secretEnv hinzu, das die Umgebungsvariable für Nutzername und Passwort angibt.
      • Fügen Sie im Feld args das Flag -c als erstes Argument hinzu. Jeder String, den Sie nach -c übergeben, wird als Befehl behandelt. Weitere Informationen zum Ausführen von Bash-Befehlen mit -c finden Sie in der Bash-Dokumentation.
      • Wenn Sie das Secret im Feld args angeben, geben Sie es mit der Umgebungsvariable $$ an.

    Die folgende Build-Konfigurationsdatei zeigt, wie Sie sich mit dem im Secret Manager gespeicherten Docker-Nutzernamen und -Passwort bei Docker anmelden und ein privates Image ausführen.

    YAML

     steps:
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
       secretEnv: ['USERNAME', 'PASSWORD']
     - name: "gcr.io/cloud-builders/docker"
       entrypoint: 'bash'
       args: ['-c', 'docker run $$USERNAME/REPOSITORY:TAG']
       secretEnv: ['USERNAME']
     availableSecrets:
       secretManager:
       - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
         env: 'PASSWORD'
       - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
         env: 'USERNAME'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker run $$USERNAME/REPOSITORY:TAG"
         ],
         "secretEnv": [
          "USERNAME"
        ]
      }
      ],
      "availableSecrets": {
        "secretManager": [{
          "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION",
          "env": "PASSWORD"
      }, {
        "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION",
        "env": "USERNAME"
         }]
      }
    }
    

    Ersetzen Sie die Platzhalterwerte in den obigen Befehlen durch Folgendes:

    • PROJECT_ID: Die ID des Google Cloud-Projekts, in dem Sie Ihre Secrets gespeichert haben.
    • DOCKER_USERNAME_SECRET_NAME: Der Secret-Name, der Ihrem Docker-Nutzernamen entspricht.
    • DOCKER_USERNAME_SECRET_VERSION: Die Secret-Version Ihres Docker-Nutzernamens.
    • DOCKER_PASSWORD_SECRET_NAME: Der Secret-Name, der Ihrem Docker-Passwort entspricht.
    • DOCKER_PASSWORD_SECRET_VERSION: Die Secret-Version Ihres Docker-Passworts.
    • REPOSITORY: Der Name des Docker-Repositories, aus dem Sie das Image abrufen.
    • TAG: Der Tag-Name Ihres Images.
  3. Verwenden Sie die Build-Konfigurationsdatei, um einen Build manuell zu starten oder Builds mit Triggern zu automatisieren.

Images an Docker Hub übertragen

So übertragen Sie öffentliche und private Images an Docker Hub:

  1. Achten Sie darauf, dass Sie Ihre Docker-Anmeldedaten im Secret Manager gespeichert und Cloud Build Zugriff auf das Secret gewährt haben.

  2. In der Build-Konfigurationsdatei:

    • Fügen Sie nach allen Build-steps ein Feld availableSecrets hinzu, das die Secret-Version und die Umgebungsvariable für den Docker-Nutzernamen und das Passwort angibt.
    • Geben Sie im Build-Schritt, in dem Sie den Nutzernamen und das Passwort angeben möchten, Folgendes ein:
      • Fügen Sie das Feld entrypoint hinzu, das auf bash verweist, um das Bash-Tool im Build-Schritt zu verwenden. Dies ist erforderlich, um auf die Umgebungsvariable für das Secret zu verweisen.
      • Fügen Sie das Feld secretEnv hinzu, das die Umgebungsvariable für Nutzername und Passwort angibt.
      • Fügen Sie im Feld args das Flag -c als erstes Argument hinzu. Jeder String, den Sie nach -c übergeben, wird als Befehl behandelt. Weitere Informationen zum Ausführen von Bash-Befehlen mit -c finden Sie in der Bash-Dokumentation.
      • Wenn Sie das Secret im Feld args angeben, geben Sie es mit der Umgebungsvariable $$ an.

    Das folgende Beispiel für eine Build-Konfigurationsdatei zeigt, wie man sich bei Docker anmeldet, ein Image mit lokal gespeichertem Quellcode erstellt und dann das Image in das Docker-Repository überträgt.

    YAML

     steps:
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
       secretEnv: ['USERNAME', 'PASSWORD']
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker build -t $$USERNAME/REPOSITORY:TAG .']
       secretEnv: ['USERNAME']
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker push $$USERNAME/REPOSITORY:TAG']
       secretEnv: ['USERNAME']
     availableSecrets:
       secretManager:
       - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
         env: 'PASSWORD'
       - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
         env: 'USERNAME'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker build -t $$USERNAME/REPOSITORY:TAG ."
         ],
         "secretEnv": [
          "USERNAME"
        ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker push $$USERNAME/REPOSITORY:TAG"
         ],
         "secretEnv": [
          "USERNAME"
        ]
      }
      ],
      "availableSecrets": {
        "secretManager": [{
          "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION",
          "env": "PASSWORD"
      }, {
        "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION",
        "env": "USERNAME"
         }]
      }
    }
    

    Ersetzen Sie die Platzhalterwerte in den obigen Befehlen durch Folgendes:

    • PROJECT_ID: Die ID des Google Cloud-Projekts, in dem Sie Ihre Secrets gespeichert haben.
    • DOCKER_USERNAME_SECRET_NAME: Der Secret-Name, der Ihrem Docker-Nutzernamen entspricht.
    • DOCKER_USERNAME_SECRET_VERSION: Die Secret-Version Ihres Docker-Nutzernamens.
    • DOCKER_PASSWORD_SECRET_NAME: Der Secret-Name, der Ihrem Docker-Passwort entspricht.
    • DOCKER_PASSWORD_SECRET_VERSION: Die Secret-Version Ihres Docker-Passworts.
    • REPOSITORY: Der Name des Docker-Repositories, in das das Image übertragen wird.
    • TAG: Der Tag-Name Ihres Images.
  3. Verwenden Sie die Build-Konfigurationsdatei, um einen Build manuell zu starten oder Builds mit Triggern zu automatisieren.

Mit Docker-Clientversionen arbeiten

Der unterstützte Docker-Builder für Cloud Build gcr.io/cloud-builders/docker verwendet Docker 20.10.14. Wenn Sie bei dieser Version beim Hochladen eines Images an Docker kein Tag angeben, überträgt Docker nur das Image mit dem Tag latest per Push. Wenn das Tag latest nicht vorhanden ist, schlägt der Push fehl.

Wenn Sie ein Image mit einem bestimmten Tag an Docker hochladen möchten, geben Sie das Tag im Build-Schritt docker push an. Im folgenden Beispiel wird ein Image mit dem Tag prod übertragen:

YAML

steps:
...
- name: 'gcr.io/cloud-builders/docker'
  args: ['docker', 'push', '$$USERNAME/myrepo:prod']
...

JSON

{
  ...
  {
    "name": "gcr.io/cloud-builders/docker",
    "args": [
      "docker",
      "push",
      "$$USERNAME/myrepo:prod"
      ],
  }
  ...
}

Wenn Sie alle Tags eines Images an Docker übertragen möchten, fügen Sie der Liste der Argumente im Build-Schritt docker push das Flag -a hinzu:

YAML

steps:
...
- name: 'gcr.io/cloud-builders/docker'
  args: ['docker', 'push', '-a', '$$USERNAME/myrepo']
...

JSON

{
  ...
  {
    "name": "gcr.io/cloud-builders/docker",
    "args": [
      "docker",
      "push",
      "-a",
      "$$USERNAME/myrepo"
      ],
  }
  ...
}

Sie können den Docker-Client 19.03.9 verwenden, indem Sie die Version im Docker-Builder taggen:

YAML

steps:
...
- name: 'gcr.io/cloud-builders/docker:19.03.9'
  args: ['docker', 'push', '$$USERNAME/myrepo:prod']
...

JSON

{
  ...
  {
    "name": "gcr.io/cloud-builders/docker:19.03.9",
    "args": [
      "docker",
      "push",
      "$$USERNAME/myrepo:prod"
      ],
  }
  ...
}

Nächste Schritte