Interactuar con imágenes de Docker Hub

Puedes usar imágenes de contenedor de Docker Hub para ejecutar tus tareas en Cloud Build. Además, si tu compilación genera imágenes, puedes enviarlas a Docker Hub. En esta página se describe cómo escribir archivos de configuración de compilación para enviar y extraer imágenes de Docker Hub. Para ver una descripción general de todos los campos disponibles en un archivo de configuración de compilación, consulta Descripción general de la configuración de compilación.

Extraer imágenes públicas de Docker Hub

En el paso de compilación, puedes extraer imágenes Docker oficiales, imágenes certificadas por Docker e imágenes personalizadas almacenadas en Docker Hub. Para ello, especifica el nombre de la imagen en el campo name. Cloud Build primero extraerá la imagen especificada de Docker Hub y, a continuación, la usará para ejecutar el paso de compilación.

En el ejemplo siguiente, Cloud Build extrae la imagen Docker de maven para ejecutar el comando mvn especificado en args:

YAML

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

JSON

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

Almacenar credenciales de Docker en Secret Manager

Para extraer imágenes privadas y enviar imágenes públicas y privadas a Docker Hub, Cloud Build tendrá que autenticarse en Docker con tus credenciales. Para incluir credenciales de Docker en tus compilaciones, primero debes almacenarlas en Secret Manager y, a continuación, conceder permiso a Cloud Build para que acceda al secreto desde Secret Manager.

Para almacenar credenciales de Docker en Secret Manager, sigue estos pasos:

  1. Ve a la página Secret Manager en la Google Cloud consola:

    Ve a la página Secret Manager.

  2. En la página Secret Manager, haz clic en Crear secreto.

  3. En la página Crear secreto, en Nombre, introduce docker-username.

  4. En el campo Valor secreto, introduce tu nombre de usuario de Docker.

  5. No modifiques la sección Regiones.

  6. Haz clic en el botón Crear secreto.

Repite los pasos anteriores para almacenar tu contraseña de Docker en Secret Manager.

Para asignar el rol de gestión de identidades y accesos Permiso para acceder a los recursos de Secret Manager al secreto de la cuenta de servicio que vas a usar en la compilación, sigue estos pasos:

  1. Abre la página Secret Manager en la Google Cloud consola:

    Ve a la página Secret Manager.

  2. Selecciona la casilla del secreto correspondiente a tu nombre de usuario y contraseña de Docker.

  3. Si aún no lo has hecho, haz clic en Mostrar panel de información para abrirlo.

  4. En el panel, en Permisos, haz clic en Añadir principal.

  5. En el campo Nuevos principales, introduce la dirección de correo de tu cuenta de servicio.

  6. En el cuadro desplegable Selecciona un rol, elige el rol Permiso para acceder a los recursos de Secret Manager.

  7. Haz clic en Guardar.

Extraer imágenes privadas de Docker Hub

Para extraer imágenes privadas de Docker Hub, sigue estos pasos:

  1. Asegúrate de haber almacenado tus credenciales de Docker en Secret Manager y de haber concedido permisos a Cloud Build para acceder al secreto.

  2. En el archivo de configuración de compilación:

    • Después de todas las compilaciones steps, añade un campo availableSecrets que especifique la versión del secreto y la variable de entorno del nombre de usuario y la contraseña de Docker.
    • En el paso de compilación en el que quieras especificar el nombre de usuario y la contraseña, haz lo siguiente:
      • Añade un campo entrypoint que apunte a bash para usar la herramienta bash en el paso de compilación. Es necesario para hacer referencia a la variable de entorno del secreto.
      • Añade un campo secretEnv que especifique la variable de entorno del nombre de usuario y la contraseña.
      • En el campo args, añade una marca -c como primer argumento. Cualquier cadena que envíes después de -c se tratará como un comando. Para obtener más información sobre cómo ejecutar comandos de bash con -c, consulta la documentación de bash.
      • Cuando especifiques el secreto en el campo args, hazlo mediante la variable de entorno con el prefijo $$.

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

    Sustituye los valores de los marcadores de posición de los comandos anteriores por los siguientes:

    • PROJECT_ID: el ID del Google Cloud proyecto en el que has almacenado tus secretos.
    • DOCKER_USERNAME_SECRET_NAME: nombre del secreto correspondiente a tu nombre de usuario de Docker.
    • DOCKER_USERNAME_SECRET_VERSION: la versión secreta de tu nombre de usuario de Docker.
    • DOCKER_PASSWORD_SECRET_NAME: nombre secreto correspondiente a tu contraseña de Docker.
    • DOCKER_PASSWORD_SECRET_VERSION: la versión secreta de tu contraseña de Docker.
    • REPOSITORY: el nombre del repositorio Docker al que vas a enviar la imagen.
    • TAG: el nombre de la etiqueta de la imagen.
  3. Usa el archivo de configuración de compilación para iniciar una compilación manualmente o para automatizar las compilaciones con activadores.

Trabajar con versiones del cliente de Docker

El compilador de Docker compatible con Cloud Build gcr.io/cloud-builders/docker usa Docker 20.10.14. Con esta versión, si no especificas una etiqueta al enviar una imagen a Docker, Docker solo envía la imagen con la etiqueta latest. Si la etiqueta latest no existe, el envío falla.

Para enviar una imagen con una etiqueta específica a Docker, especifica la etiqueta en el docker push paso de compilación. En el siguiente ejemplo se inserta una imagen etiquetada como 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"
      ],
  }
  ...
}

Para enviar todas las etiquetas de una imagen a Docker, añade la marca -a a la lista de argumentos del paso de compilación docker push:

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

Puedes usar el cliente de Docker 19.03.9 etiquetando la versión en el compilador de 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"
      ],
  }
  ...
}

Siguientes pasos