Configure as atualizações automáticas de imagens base

A configuração de atualizações automáticas de imagens base para o Cloud Run permite à Google aplicar patches de segurança ao sistema operativo e aos componentes de tempo de execução da linguagem da imagem base automaticamente. Não tem de reconstruir nem voltar a implementar o seu serviço para que a imagem base seja atualizada. Não é criada nenhuma nova revisão quando a imagem base é atualizada.

Para saber como definir políticas de atualização de segurança em funções criadas com comandos gcloud functions ou a API Cloud Functions v2, consulte o artigo Segurança do ambiente de execução.

O diagrama seguinte mostra como o código e as dependências da sua aplicação ("imagem da app") são sobrepostos ao tempo de execução da linguagem, aos pacotes do SO e ao sistema operativo ("imagem base"). Os componentes da imagem base são atualizados automaticamente pela Google.

Diagrama da imagem base do Cloud Run

Política de atualizações de segurança

  • Atualizações automáticas: as atualizações e os patches de segurança para o ambiente de execução são publicados em novas versões da imagem do ambiente de execução. Após um período de testes de estabilidade e fiabilidade, o tempo de execução atualizado é implementado em todos os serviços, o que resulta numa atualização sem tempo de inatividade. Para aplicar correções de segurança ao nível do idioma, pode ter de reconstruir funções ou serviços que usam linguagens compiladas, como Go ou Java.

  • Em atualizações de implementação: as atualizações e os patches de segurança são aplicados aos tempos de execução apenas quando os serviços são implementados ou reimplementados, salvo indicação em contrário. As atualizações sobre a implementação estão disponíveis nas funções do Cloud Run (1.ª geração) e nas funções do Cloud Run.

Por predefinição, as atualizações de segurança automáticas estão ativadas para funções implementadas através de:

Configure as atualizações automáticas de imagens base

Para configurar atualizações automáticas de imagens base, faça o seguinte:

  • Selecione uma imagem base do Cloud Run compatível.
  • Crie e implemente a imagem da aplicação de forma a preservar a capacidade de rebasear em segurança o serviço em execução.

Selecione uma imagem base

Uma imagem base é o ponto de partida para a maioria dos fluxos de trabalho de desenvolvimento baseados em contentores. Os programadores começam com uma imagem base e adicionam-lhe as bibliotecas, os ficheiros binários e os ficheiros de configuração necessários para executar a respetiva aplicação.

Os buildpacks do Google Cloud publicam e mantêm imagens base para criar aplicações sem servidor. Estas imagens base são criadas com base na distribuição Linux Ubuntu.

O Cloud Run só suporta imagens base automáticas que usam as imagens base dos buildpacks do Google Cloud.

Tem de considerar o seguinte ao escolher uma imagem base de buildpacks:

  • Pilha: uma pilha é composta por uma versão de distribuição do Linux e pacotes do sistema, como o OpenSSL e o curl.
  • Idioma: a versão específica da linguagem de programação usada pela sua aplicação.

Reveja as imagens base de tempo de execução para saber mais sobre as variações das imagens base.

Criar a imagem da aplicação

Os serviços com atualizações automáticas ativadas têm de fornecer uma imagem da aplicação que omita as camadas do sistema operativo base. Existem duas formas de o fazer:

  • Use a implementação do Cloud Run a partir da origem (recomendado)
  • Usando um sistema de compilação, copie a sua aplicação para uma scratch imagem

Implemente a partir da origem

Pode usar a opção de implementação de origem do Cloud Run para compilar e implementar o seu código, de modo que o seu serviço seja compatível com a receção de atualizações automáticas. Para o fazer, tem de fornecer a flag --base-image quando criar a sua aplicação.

Por exemplo, para implementar um serviço Node.js com as atualizações automáticas da imagem de base ativadas, usaria o seguinte comando:

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

Para implementar uma função, tem de especificar a flag --function com o ponto de entrada da função a partir do código-fonte.

Criação: scratch

Também pode usar a sua cadeia de ferramentas de compilação para criar uma imagem de contentor de aplicação compatível com atualizações automáticas de imagens base.

Quando implementa um serviço do Cloud Run com atualizações automáticas da imagem base, a imagem do contentor da sua aplicação é sobreposta a uma imagem do contentor base. A imagem do contentor da aplicação só deve incluir a sua aplicação e não o sistema operativo nem o tempo de execução, que são fornecidos na imagem do contentor base.

Para criar a imagem do contentor da aplicação, faça o seguinte:

  1. Crie um ficheiro Docker de várias fases que:
    1. Cria a aplicação com uma imagem de base adequada com as dependências necessárias.
    2. Copia os componentes criados para uma imagem temporária.
  2. Crie a imagem do contentor da aplicação e envie-a para o Artifact Registry.
  3. Implemente a imagem do contentor da aplicação no Cloud Run e especifique uma imagem base.

Crie um Dockerfile de várias fases

Vamos usar uma aplicação Node.js para este guia. Este guia não é específico do idioma e pode ser personalizado para a sua aplicação e idioma.

  • Crie um Dockerfile no diretório raiz do nosso projeto com o seguinte:

    # 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 uma compilação de várias fases para copiar o código fonte da aplicação e as dependências para uma imagem scratch que omite o sistema operativo, os pacotes e os componentes de tempo de execução que serão fornecidos no tempo de execução pela imagem base gerida do Cloud Run.

Criar a imagem da aplicação

Crie a imagem da aplicação e carregue-a no Artifact Registry. Consulte o artigo sobre a criação de contentores para ver detalhes sobre como criar um Dockerfile com o Cloud Build e carregá-lo para o Artifact Registry.

Implemente a imagem da aplicação

Já pode implementar a imagem da aplicação com as atualizações automáticas ativadas através da imagem de base mais compatível com a sua aplicação. O exemplo seguinte usa o tempo de execução nodejs22 e a região europe-west1. Para saber mais sobre as variações de imagens base, reveja as imagens base de tempo de execução.

Consulte o artigo Implemente a partir do código fonte para ver detalhes adicionais sobre as funções e as autorizações necessárias.

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 ativar as atualizações automáticas do tempo de execução do nodejs22 ao implementar a imagem da aplicação, execute o seguinte comando:

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

    Substitua o seguinte:

    • SERVICE: o nome do serviço para o qual quer implementar.
    • APP_IMAGE: o URL da imagem do contentor da sua aplicação.
    • BASE_IMAGE: o URL da sua imagem base, por exemplo, nodejs22 ou europe-west1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22 Reveja as imagens base de tempo de execução para saber mais sobre as variações de imagens base.
  3. YAML

    1. Se estiver a criar um novo serviço, ignore este passo. Se estiver a atualizar um serviço existente, transfira a respetiva configuração YAML:

      gcloud run services describe SERVICE --format export > service.yaml
    2. Atualize runtimeClassName e as anotações 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

      Substitua o seguinte:

      • SERVICE: o nome do serviço para o qual quer implementar.
      • APP_IMAGE: o URL da imagem do contentor da sua aplicação.
      • BASE_IMAGE: o URL da imagem base, por exemplo, europe-west1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22. Reveja as imagens base do tempo de execução para saber mais sobre as variações das imagens base.

    Terraform

    Para saber como aplicar ou remover uma configuração do Terraform, consulte os comandos básicos do Terraform.

    Adicione o seguinte a um recurso google_cloud_run_v2_service na sua configuração do 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"
        }
      }
    }
    

    Substitua o seguinte:

    • SERVICE: o nome do serviço para o qual quer implementar.
    • REGION: a Google Cloud região.
    • IMAGE_URL: uma referência à imagem do contentor, por exemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Se usar o Artifact Registry, o repositório REPO_NAMEtem de já estar criado. O URL segue o formato LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG .
    • BASE_IMAGE: o URL da imagem base, por exemplo, us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22. Reveja as imagens base do tempo de execução para saber mais sobre as variações das imagens base.

Reassemble imagens de contentores para execução local

As imagens de contentores de aplicações usadas com atualizações automáticas de imagens base são criadas com base no scratch e não podem ser executadas fora do Cloud Run com as atualizações de imagens base ativadas. Pode tornar a imagem da aplicação executável ao alterar a base da imagem da aplicação com base numa imagem base compatível.

  1. Instale o Docker Community Edition (CE) na sua estação de trabalho.

  2. Transfira a imagem da aplicação:

    docker pull APP_IMAGE
    

    Substitua APP_IMAGE pelo URL da imagem do contentor.

  3. Transfira a imagem de base:

    docker pull BASE_IMAGE
    

    Substitua BASE_IMAGE pelo caminho completo da imagem de base de uma imagem compatível. Consulte as imagens base dos buildpacks do Google Cloud para ver uma lista de imagens base disponíveis.

  4. Reúna a imagem:

    Use um Dockerfile para copiar todos os ficheiros da imagem da app de volta para a imagem 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 / /
    

    Crie a imagem:

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

    Substitua IMAGE pelo nome da imagem remontada.

    Se vir avisos de que ARG ${APP_IMAGE} e ARG ${NEW_BASE_IMAGE} não são imagens base válidas, pode ignorá-los com segurança e executar a imagem:

    docker run -p 8080:8080 IMAGE
    

Desative as atualizações automáticas

Quando implementa a partir da origem

Quando implementa a partir da origem, pode desativar as atualizações automáticas da imagem base através da flag --no-automatic-updates. O exemplo seguinte mostra como desativar as atualizações automáticas de imagens base para um serviço Node.js:

gcloud

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

Quando implementa uma imagem de contentor

Para desativar as atualizações de imagens base para um serviço que usa uma imagem de contentor criada com base em scratch, tem de implementar uma nova imagem de contentor que inclua a imagem base e remover a imagem base:

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 desativar as atualizações automáticas da imagem de base, execute o seguinte comando:

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

    Substitua o seguinte:

    • SERVICE: o nome do serviço para o qual quer implementar.
    • IMAGE: o URL da imagem do contentor que contém a app, o tempo de execução e o SO.
  3. YAML

    1. Se estiver a criar um novo serviço, ignore este passo. Se estiver a atualizar um serviço existente, transfira a respetiva configuração YAML:

      gcloud run services describe SERVICE --format export > service.yaml
    2. Elimine a anotação run.googleapis.com/base-images.

    3. Elimine o atributo runtimeClassName.

    4. Em image, certifique-se de que usa uma imagem de contentor que inclua a app, o tempo de execução e o SO.

    5. Crie ou atualize o serviço com o seguinte comando:

      gcloud run services replace service.yaml

Veja a versão da imagem base

Para ver a versão da imagem base usada para publicar a sua aplicação, veja o recurso LogEntry.labels.run.googleapis.com/base_image_versions nos registos do serviço do Cloud Run.

Limitações conhecidas

  • As atualizações automáticas de imagens base só são compatíveis com imagens base de buildpacks do Google Cloud. Não é possível usar as suas próprias imagens base.

  • As aplicações que usam linguagens compiladas não são recompiladas como resultado de uma atualização automática da imagem de base.

  • As análises de segurança na imagem da aplicação podem estar incompletas. Uma vez que a imagem da sua aplicação é agora criada no scratch, os scanners de segurança apenas analisam a parte da aplicação da sua imagem. Para ter uma imagem mais completa da segurança do seu contentor, também tem de executar análises na imagem base fornecida pela Google correspondente. Pode transferir a imagem base e usar ferramentas de código aberto para executar uma análise.