Configurar actualizaciones automáticas de la imagen base

Si configuras las actualizaciones automáticas de la imagen base en Cloud Run, Google podrá aplicar automáticamente parches de seguridad a los componentes del sistema operativo y del tiempo de ejecución del lenguaje de la imagen base. No tienes que volver a compilar ni a desplegar tu servicio para que se actualice la imagen base. No se crea ninguna revisión nueva cuando se actualiza la imagen base.

Para obtener información sobre cómo definir políticas de actualización de seguridad en funciones creadas con comandos de gcloud functions o con la API Cloud Functions v2, consulte Seguridad del entorno de ejecución.

En el siguiente diagrama se muestra cómo se superponen el código de la aplicación y las dependencias ("imagen de la aplicación") sobre el tiempo de ejecución del lenguaje, los paquetes del SO y el sistema operativo ("imagen base"). Google actualiza automáticamente los componentes de la imagen base.

Diagrama de imagen base de Cloud Run

Política de actualizaciones de seguridad

  • Actualizaciones automáticas: las actualizaciones y los parches de seguridad del entorno de ejecución se publican en nuevas versiones de la imagen del entorno de ejecución. Tras un periodo de pruebas para comprobar su estabilidad y fiabilidad, el tiempo de ejecución actualizado se implementa en todos los servicios, lo que da como resultado una actualización sin tiempo de inactividad. Para aplicar correcciones de seguridad a nivel de idioma, es posible que tengas que volver a compilar las funciones o los servicios que usen idiomas compilados, como Go o Java.

  • En las actualizaciones de la implementación: las actualizaciones y los parches de seguridad se aplican a los tiempos de ejecución solo cuando se implementan o se vuelven a implementar los servicios, a menos que se indique lo contrario. Las actualizaciones sobre la implementación están disponibles tanto en Cloud Functions (1.ª gen.) como en Cloud Run Functions.

De forma predeterminada, las actualizaciones de seguridad automáticas están habilitadas para las funciones implementadas mediante:

Configurar actualizaciones automáticas de la imagen base

Para configurar las actualizaciones automáticas de la imagen base, sigue estos pasos:

  • Selecciona una imagen base de Cloud Run compatible.
  • Crea y despliega la imagen de tu aplicación de forma que se conserve la capacidad de cambiar la base de tu servicio en ejecución de forma segura.

Seleccionar una imagen base

Una imagen base es el punto de partida de la mayoría de los flujos de trabajo de desarrollo basados en contenedores. Los desarrolladores empiezan con una imagen base y añaden las bibliotecas, los archivos binarios y los archivos de configuración necesarios para ejecutar su aplicación.

Los buildpacks de Google Cloud publican y mantienen imágenes base para crear aplicaciones sin servidor. Estas imágenes base se han creado a partir de la distribución de Linux Ubuntu.

Cloud Run solo admite imágenes base automáticas que usan imágenes base de buildpacks de Google Cloud.

Debes tener en cuenta lo siguiente al elegir una imagen base de los paquetes de compilación:

  • Pila: una pila se compone de una versión de distribución de Linux y paquetes del sistema, como OpenSSL y curl.
  • Idioma: la versión específica del lenguaje de programación que usa tu aplicación.

Consulta las imágenes base de tiempo de ejecución para obtener más información sobre las variaciones de las imágenes base.

Crear la imagen de la aplicación

Los servicios con las actualizaciones automáticas habilitadas deberán proporcionar una imagen de aplicación que omita las capas del sistema operativo base. Hay dos formas de hacerlo:

  • Usar la opción de desplegar desde el código fuente de Cloud Run (recomendado)
  • Copia tu aplicación en una imagen scratch con un sistema de compilación.

Desplegar desde el código fuente

Puedes usar la opción de despliegue de código fuente de Cloud Run para compilar y desplegar tu código de forma que tu servicio sea compatible con la recepción de actualizaciones automáticas. Para ello, debe proporcionar la marca --base-image al crear su aplicación.

Por ejemplo, para desplegar un servicio de Node.js con las actualizaciones automáticas de la imagen base habilitadas, usarías el siguiente comando:

gcloud run deploy \
    --source . \
    --base-image nodejs22 \
    --automatic-updates

Para desplegar una función, debes especificar la marca --function con el punto de entrada de la función de tu código fuente.

Compilación en scratch

También puedes usar tu cadena de herramientas de compilación para crear una imagen de contenedor de aplicación que sea compatible con las actualizaciones automáticas de la imagen base.

Cuando despliegas un servicio de Cloud Run con actualizaciones automáticas de la imagen base, la imagen de contenedor de tu aplicación se coloca en capas sobre una imagen de contenedor base. La imagen de contenedor de la aplicación solo debe incluir la aplicación, no el sistema operativo ni el tiempo de ejecución, que se proporcionan en la imagen de contenedor base.

Para crear la imagen del contenedor de la aplicación, haz lo siguiente:

  1. Crea un Dockerfile de varias fases que:
    1. Compila la aplicación con una imagen base adecuada con las dependencias necesarias.
    2. Copia los componentes creados en una imagen de borrador.
  2. Crea la imagen de contenedor de la aplicación y envíala a Artifact Registry.
  3. Despliega la imagen de contenedor de la aplicación en Cloud Run y especifica una imagen base.

Crear un Dockerfile de varias fases

En esta guía, usaremos una aplicación de Node.js. Esta guía no está dirigida a un idioma concreto y se puede personalizar para tu aplicación e idioma.

  • Crea un archivo Dockerfile en el directorio raíz de nuestro proyecto con lo siguiente:

    # This Dockerfile will produce an image that only includes the Node.js app and *not* the Node.js runtime.
    # The resulting image will not run locally. It is intended at being layered on top of a Node.js base image.
    
    FROM node:22-slim as builder
    
    # Create and change to the app directory.
    WORKDIR /usr/src/app
    
    # Copy application dependency manifests to the container image and install
    # production dependencies.
    COPY package*.json ./
    RUN npm install --only=production
    
    # Copy local code to the container image.
    COPY . ./
    
    # Copy the application source code and dependencies onto a scratch image.
    FROM scratch
    WORKDIR /workspace
    COPY --from=builder --chown=33:33 /usr/src/app/ ./
    USER 33:33
    
    # Run the web service on container startup.
    CMD [ "node", "index.js" ]
    

Este Dockerfile usa una compilación multietapa para copiar el código fuente de la aplicación y las dependencias en una imagen scratch que omite el sistema operativo, los paquetes y los componentes de tiempo de ejecución que se proporcionarán en el tiempo de ejecución mediante la imagen base gestionada de Cloud Run.

Crear la imagen de la aplicación

Crea la imagen de tu aplicación y súbela a Artifact Registry. Consulta la sección sobre compilación de contenedores para obtener información sobre cómo compilar un Dockerfile con Cloud Build y subirlo a Artifact Registry.

Desplegar la imagen de la aplicación

Ahora puedes implementar la imagen de tu aplicación con las actualizaciones automáticas habilitadas mediante la imagen base más compatible con tu aplicación. En el siguiente ejemplo se usan el tiempo de ejecución nodejs22 y la región europe-west1. Para obtener más información sobre las variantes de imagen base, consulta las imágenes base de tiempo de ejecución.

Consulta Implementar desde el código fuente para obtener más información sobre los roles y permisos necesarios.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Para habilitar las actualizaciones automáticas del tiempo de ejecución de nodejs22 al desplegar la imagen de tu aplicación, ejecuta el siguiente comando:

    gcloud run deploy SERVICE \
        --image APP_IMAGE \
        --base-image BASE_IMAGE

    Haz los cambios siguientes:

    • SERVICE: el nombre del servicio en el que quieres implementar.
    • APP_IMAGE: la URL de la imagen del contenedor de tu aplicación.
    • BASE_IMAGE: la URL de la imagen base. Por ejemplo, nodejs22 o europe-west1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22. Consulta Imágenes base en tiempo de ejecución para obtener más información sobre las variaciones de la imagen base.
  3. YAML

    1. Si va a crear un servicio, puede saltarse este paso. Si va a actualizar un servicio, descargue su configuración YAML:

      gcloud run services describe SERVICE --format export > service.yaml
    2. Actualiza runtimeClassName y las anotaciones de run.googleapis.com/base-images:

      apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
        name: SERVICE
      spec:
        template:
          metadata:
            annotations:
              run.googleapis.com/base-images: '{"NAME":"BASE_IMAGE"}'
          spec:
            containers:
            - name: NAME
              image: APP_IMAGE
            runtimeClassName: run.googleapis.com/linux-base-image-update

      Haz los cambios siguientes:

      • SERVICE: el nombre del servicio en el que quieres implementar.
      • APP_IMAGE: la URL de la imagen del contenedor de tu aplicación.
      • BASE_IMAGE: la URL de la imagen base, por ejemplo, europe-west1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22. Consulta Imágenes base de tiempo de ejecución para obtener más información sobre las variaciones de las imágenes base.

    Terraform

    Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.

    Añade lo siguiente a un recurso google_cloud_run_v2_service en tu configuración de Terraform:

    resource "google_cloud_run_v2_service" "default" {
      provider = google-beta
      name     = "SERVICE"
      location = "REGION"
    
      template {
        containers {
          image = "IMAGE_URL"
          base_image_uri = "BASE_IMAGE"
        }
      }
    }
    

    Haz los cambios siguientes:

    • SERVICE: el nombre del servicio en el que quieres implementar.
    • REGION: la Google Cloud región.
    • IMAGE_URL: una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Si usas Artifact Registry, el repositorio REPO_NAME ya debe estar creado. La URL sigue el formato LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG .
    • BASE_IMAGE: la URL de la imagen base, por ejemplo, us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22. Consulta Imágenes base de tiempo de ejecución para obtener más información sobre las variaciones de las imágenes base.

Recompón imágenes de contenedor para ejecutarlas de forma local

Las imágenes de contenedor de aplicaciones que se usan con actualizaciones automáticas de imágenes base se compilan en scratch y no se pueden ejecutar fuera de Cloud Run con las actualizaciones de imágenes base habilitadas. Puedes hacer que la imagen de tu aplicación se pueda ejecutar cambiando la base de la imagen de la aplicación por una imagen base compatible.

  1. Instala Docker Community Edition (CE) en tu estación de trabajo.

  2. Descarga la imagen de la aplicación:

    docker pull APP_IMAGE
    

    Sustituye APP_IMAGE por la URL de la imagen de tu contenedor.

  3. Descarga la imagen base:

    docker pull BASE_IMAGE
    

    Sustituye BASE_IMAGE por la ruta de imagen completa de una imagen base compatible. Consulta la lista de imágenes base de los buildpacks de Google Cloud.

  4. Reconstruye la imagen:

    Usa un Dockerfile para copiar todos los archivos de la imagen de la aplicación en la imagen base:

    ARG APP_IMAGE
    ARG NEW_BASE_IMAGE
    
    # first copy all files from the app image onto the builder image
    FROM ${APP_IMAGE} AS app
    FROM ${NEW_BASE_IMAGE} AS builder
    COPY --from=app / /
    
    # restore the app image config by copying everything from previous step back
    # back onto the app image
    FROM ${APP_IMAGE}
    COPY --from=builder / /
    

    Crea la imagen:

    docker build \
        -t IMAGE \
        --build-arg APP_IMAGE=APP_IMAGE \
        --build-arg NEW_BASE_IMAGE=BASE_IMAGE \
        .
    

    Sustituye IMAGE por el nombre de la imagen reensamblada.

    Si ves advertencias que indican que ARG ${APP_IMAGE} y ARG ${NEW_BASE_IMAGE} no son imágenes base válidas, puedes ignorarlas y ejecutar la imagen:

    docker run -p 8080:8080 IMAGE
    

Inhabilitar las actualizaciones automáticas

Al desplegar desde el código fuente

Cuando implementes desde la fuente, puedes inhabilitar las actualizaciones automáticas de la imagen base con la marca --no-automatic-updates. En el siguiente ejemplo se muestra cómo inhabilitar las actualizaciones automáticas de la imagen base de un servicio Node.js:

gcloud

gcloud run deploy SERVICE \
    --source . \
    --base-image nodejs22 \
    --no-automatic-updates

Al desplegar una imagen de contenedor

Para inhabilitar las actualizaciones de la imagen base de un servicio que usa una imagen de contenedor creada en scratch, debes desplegar una nueva imagen de contenedor que incluya la imagen base y eliminarla:

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Para inhabilitar las actualizaciones automáticas de la imagen base, ejecuta el siguiente comando:

    gcloud run deploy SERVICE \
        --image IMAGE \
        --base-image ""

    Haz los cambios siguientes:

    • SERVICE: el nombre del servicio en el que quieres implementar.
    • IMAGE: la URL de la imagen de tu contenedor que contiene la aplicación, el tiempo de ejecución y el SO.
  3. YAML

    1. Si va a crear un servicio, puede saltarse este paso. Si va a actualizar un servicio, descargue su configuración YAML:

      gcloud run services describe SERVICE --format export > service.yaml
    2. Elimina la anotación run.googleapis.com/base-images.

    3. Elimina el atributo runtimeClassName.

    4. En image, asegúrate de usar una imagen de contenedor que incluya la aplicación, el tiempo de ejecución y el SO.

    5. Crea o actualiza el servicio con el siguiente comando:

      gcloud run services replace service.yaml

Ver la versión de la imagen base

Para ver la versión de la imagen base que se usa para servir tu aplicación, consulta el recurso LogEntry.labels.run.googleapis.com/base_image_versions en los registros de servicio de Cloud Run.

Limitaciones conocidas

  • Las actualizaciones automáticas de imágenes base solo admiten imágenes base de paquetes de compilación de Google Cloud. No es posible usar tus propias imágenes base.

  • Las aplicaciones que usen lenguajes compilados no se volverán a compilar como resultado de una actualización automática de la imagen base.

  • Es posible que los análisis de seguridad de la imagen de tu aplicación no estén completos. Como la imagen de tu aplicación ahora se compila en scratch, los escáneres de seguridad solo analizarán la parte de la aplicación de tu imagen. Para obtener una imagen más completa de la seguridad de tus contenedores, también debes ejecutar análisis en la imagen base correspondiente proporcionada por Google. Puedes descargar la imagen base y usar herramientas de código abierto para realizar un análisis.