Interazione con le immagini Docker Hub

Puoi utilizzare le immagini container di Docker Hub per eseguire le tue attività in Cloud Build. Inoltre, se la build produce immagini, puoi spingerle su Docker Hub. Questa pagina descrive come scrivere file di configurazione di compilazione per eseguire il push e il pull delle immagini di Docker Hub. Per una panoramica di tutti i campi disponibili in un file di configurazione della build, consulta Panoramica della configurazione della build.

Estrazione di immagini pubbliche da Docker Hub

Puoi eseguire il pull di immagini Docker ufficiali, immagini certificate Docker e immagini personalizzate archiviate in Docker Hub nel tuo passaggio di compilazione specificando il nome dell'immagine nel campo name. Cloud Build estrae prima l'immagine specificata da Docker Hub e poi la utilizza per eseguire il passaggio di build.

Nell'esempio seguente, Cloud Build estrae l'immagine Docker per maven per eseguire il comando mvn specificato in args:

YAML

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

JSON

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

Archiviazione delle credenziali Docker in Secret Manager

Per eseguire il pull di immagini private ed eseguire il push di immagini pubbliche e private su Docker Hub, Cloud Build dovrà autenticarsi in Docker con le tue credenziali. Per includere le credenziali Docker nelle build, devi prima archiviarle in Secret Manager e poi concedere a Cloud Build l'autorizzazione per accedere al secret da Secret Manager.

Per archiviare le credenziali Docker in Secret Manager:

  1. Vai alla pagina Secret Manager nella console Google Cloud :

    Vai alla pagina Secret Manager

  2. Nella pagina Secret Manager, fai clic su Crea secret.

  3. Nella pagina Crea secret, in Nome, inserisci docker-username.

  4. Nel campo Valore secret, inserisci il tuo nome utente Docker.

  5. Lascia invariata la sezione Regioni.

  6. Fai clic sul pulsante Crea secret.

Ripeti i passaggi precedenti per archiviare la password di Docker in Secret Manager.

Per concedere il ruolo IAM Accesso ai secret di Secret Manager per il secret all'account di servizio che utilizzi per la compilazione:

  1. Apri la pagina Secret Manager nella console Google Cloud :

    Vai alla pagina Secret Manager

  2. Seleziona la casella di controllo del secret corrispondente al tuo nome utente e alla tua password Docker.

  3. Se non è già aperto, fai clic su Mostra riquadro informazioni per aprirlo.

  4. Nel riquadro, fai clic su Aggiungi entità in Autorizzazioni.

  5. Nel campo Nuove entità, inserisci l'indirizzo email del tuo account di servizio.

  6. Nella casella a discesa Seleziona un ruolo, seleziona il ruolo Accesso ai segreti di Secret Manager.

  7. Fai clic su Salva.

Eseguire il pull di immagini private da Docker Hub

Per eseguire il pull delle immagini private da Docker Hub:

  1. Assicurati di aver archiviato le credenziali Docker in Secret Manager e di aver concesso a Cloud Build le autorizzazioni per accedere al secret.

  2. Nel file di configurazione della build:

    • Dopo tutta la build steps, aggiungi un campo availableSecrets che specifichi la versione del segreto e la variabile env per il nome utente e la password di Docker.
    • Nel passaggio di compilazione in cui vuoi specificare il nome utente e la password:
      • Aggiungi un campo entrypoint che rimandi a bash per utilizzare lo strumento bash nel passaggio di compilazione. Questo è necessario per fare riferimento alla variabile di ambiente per il segreto.
      • Aggiungi un campo secretEnv che specifichi la variabile di ambiente per nome utente e password.
      • Nel campo args, aggiungi un flag -c come primo argomento. Qualsiasi stringa passata dopo -c viene trattata come un comando. Per ulteriori informazioni sull'esecuzione di comandi bash con -c, consulta la documentazione di bash.
      • Quando specifichi il segreto nel campo args, utilizza la variabile di ambiente con prefisso $$.

    The following build config file shows how to login to Docker using the Docker username and password stored in Secret Manager, and run a private image.

    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"
         }]
      }
    }
    

    Replace the placeholder values in the above commands with the following:

    • PROJECT_ID: The ID of the Google Cloud project where you've stored your secrets.
    • DOCKER_USERNAME_SECRET_NAME: The secret name corresponding to your Docker username.
    • DOCKER_USERNAME_SECRET_VERSION: The secret version of your Docker username.
    • DOCKER_PASSWORD_SECRET_NAME: The secret name corresponding to your Docker password.
    • DOCKER_PASSWORD_SECRET_VERSION: The secret version of your Docker password.
    • REPOSITORY: The name of your Docker repository from where you're pulling the image.
    • TAG: The tag name of your image.
  3. Use the build config file to manually start a build or to automate builds using triggers.

Pushing images to Docker Hub

To push public and private images to Docker Hub:

  1. Make sure you've stored your Docker credentials in Secret Manager and granted permissions for Cloud Build to access the secret.

  2. In the build config file:

    • After all the build steps, add an availableSecrets field specifying the secret version and the env variable for the Docker username and password.
    • In the build step where you want to specify the username and password:
      • Add an entrypoint field pointing to bash to use the bash tool in the build step. This is required to refer to the environment variable for the secret.
      • Add a secretEnv field specifying the environment variable for username and password.
      • In the args field, add a -c flag as the first argument. Any string you pass after -c is treated as a command. For more information on running bash commands with -c, see the bash documentation.
      • When specifying the secret in the args field, specify it using the environment variable prefixed with $$.

    The following example build config file shows how to login to Docker, build an image with source code stored locally, and then push the image to Docker repository.

    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"
         }]
      }
    }
    

    Sostituisci i valori segnaposto nei comandi precedenti con quanto segue:

    • PROJECT_ID: l'ID del progetto Google Cloud dove hai archiviato i tuoi secret.
    • DOCKER_USERNAME_SECRET_NAME: il nome del segreto corrispondente al tuo nome utente Docker.
    • DOCKER_USERNAME_SECRET_VERSION: la versione segreta del tuo nome utente Docker.
    • DOCKER_PASSWORD_SECRET_NAME: il nome del segreto corrispondente alla password di Docker.
    • DOCKER_PASSWORD_SECRET_VERSION: la versione segreta della password di Docker.
    • REPOSITORY: il nome del repository Docker a cui stai spingendo l'immagine.
    • TAG: il nome del tag dell'immagine.
  3. Utilizza il file di configurazione della build per avviare manualmente una build o per automatizzare le build utilizzando gli trigger.

Utilizzo delle versioni del client Docker

Il builder Docker supportato per Cloud Build, gcr.io/cloud-builders/docker utilizza Docker 20.10.14. Con questa versione, se non specifichi un tag quando pushi un'immagine in Docker, Docker esegue il push solo dell'immagine con il tag latest. Se il tag latest non esiste, l'operazione push non va a buon fine.

Per eseguire il push di un'immagine con un tag specifico in Docker, specifica il tag nel docker push passaggio di compilazione. L'esempio seguente spinge un'immagine taggata prod:

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"
      ],
  }
  ...
}

Per eseguire il push di tutti i tag di un'immagine in Docker, aggiungi il flag -a all'elenco di arg nel docker push passaggio di compilazione:

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"
      ],
  }
  ...
}

Puoi utilizzare il client Docker 19.03.9 taggando la versione nel builder Docker:

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"
      ],
  }
  ...
}

Passaggi successivi