Configurar atualizações automáticas da imagem de base

Configurar atualizações automáticas da imagem de base para o Cloud Run permitir que o Google faça patches de segurança para os componentes do sistema operacional e do ambiente de execução de linguagem da imagem de base automaticamente. Não é necessário recriar ou reimplantar o serviço para que a imagem de base seja atualizada. Nenhuma nova revisão é criada quando a imagem de base é atualizada.

O diagrama a seguir mostra como o código do aplicativo e as dependências ("imagem do app") são sobrepostas ao ambiente de execução da linguagem, aos pacotes do SO e ao sistema operacional ("imagem de base"). Os componentes da imagem de base são atualizados automaticamente pelo Google.

Diagrama da imagem de base do Cloud Run

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

  • Selecione uma imagem de base do Cloud Run compatível.
  • Crie e implante a imagem do aplicativo de uma maneira que preserve a capacidade de refazer a base do serviço em execução com segurança.

Selecionar uma imagem de base

A imagem base é o ponto de partida para a maioria dos fluxos de trabalho de desenvolvimento baseados em contêineres. Os desenvolvedores começam com uma imagem base e adicionam bibliotecas, binários e arquivos de configuração necessários para executar seus para o aplicativo.

Os buildpacks do Google Cloud publicam e mantêm imagens de base para criar aplicativos sem servidor. Essas imagens de base são criadas na parte superior da distribuição do Ubuntu Linux.

O Cloud Run só aceita imagens de base automáticas que usam Imagens de base dos buildpacks do Google Cloud.

Considere o seguinte ao escolher os buildpacks do Google Cloud:

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

Consulte imagens de base do ambiente de execução para saber mais sobre as variações de imagens de base.

Como criar a imagem do aplicativo

Os serviços com atualizações automáticas ativadas precisam fornecer um aplicativo imagem que omite as camadas do sistema operacional básico. Há duas maneiras de fazer isso.

Implantar a partir da origem

É possível usar o recurso implantar do source do Cloud Run para criar e implantar seu código de modo que o serviço seja compatível com o recebimento de atualizações automáticas. Para fazer isso, forneça a flag --base-image ao criar o app.

Por exemplo, para implantar um serviço ou função do Node.js com atualizações automáticas de imagem base ativadas, use o seguinte comando:

gcloud beta run deploy \
  --source . \
  --base-image nodejs20

Criado em scratch

Você também pode usar o conjunto de ferramentas de build para criar uma imagem do container do aplicativo compatível com atualizações automáticas de imagem base.

Quando você implanta um serviço do Cloud Run com atualizações automáticas de imagem de base, a imagem do contêiner do aplicativo é sobreposta a uma imagem de contêiner de base. A imagem do contêiner do aplicativo deve incluir apenas o aplicativo, não o sistema operacional ou o ambiente de execução, que são fornecidos na imagem de contêiner de base.

Para criar a imagem do contêiner do aplicativo, faça o seguinte:

  1. Crie um Dockerfile com vários estágios que:
    1. Cria o aplicativo usando uma imagem de base adequada com as dependências necessárias.
    2. Copia os componentes criados em uma imagem de scratch.
  2. Crie a imagem do contêiner do aplicativo e envie-a para o Artifact Registry.
  3. Implante a imagem do contêiner do aplicativo no Cloud Run e especifique uma imagem base.

Criar um Dockerfile com vários estágios

Usaremos um aplicativo Node.js para este guia. Este guia não é um idioma específicos e pode ser personalizados para seu aplicativo e idioma

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

    # 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 intented at being layered on top of a Node.js base image.
    
    FROM node:20-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 depenencies onto a scratch image.
    FROM scratch
    WORKDIR /workspace
    COPY --from=builder --chown=33:33 /usr/src/app/ ./
    
    # Run the web service on container startup.
    CMD [ "node", "index.js" ]
    

Esse Dockerfile usa um build multiestágio para copiar o código-fonte e as dependências do aplicativo para uma imagem scratch que omite o sistema operacional, os pacotes e os componentes de execução que serão fornecidos no momento da execução pela imagem de base gerenciada do Cloud Run.

Como criar a imagem do aplicativo

Crie a imagem do aplicativo e faça upload dela no Artifact Registry. Consulte construção contêineres para saber como criar um Dockerfile com Cloud Build e upload para o Artifact Registry

Implantar a imagem do aplicativo

Agora está tudo pronto para implantar a imagem do aplicativo com atualizações automáticas ativado usando a imagem de base mais compatível com seu aplicativo. Usaremos o ambiente de execução do Node.js 20 da us-central1 para este exemplo. Analise Imagens de base do ambiente de execução para saber mais sobre as variações da imagem de base.

Consulte Implantar imagens de contêiner no Cloud Run para mais detalhes sobre os papéis e as permissões necessários.

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 ambiente de execução do Node.js 20 durante a implantação da imagem do aplicativo, execute o seguinte comando:

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

    Substitua:

    • SERVICE pelo nome do serviço em que você quer implantar.
    • APP_IMAGE pelo URL da imagem do contêiner do aplicativo.
    • BASE_IMAGE com o URL da imagem de base, por exemplo, nodejs20 ou us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20 Consulte Imagens de base do ambiente de execução para saber mais sobre as variações da imagem de base.

YAML

  1. Se você estiver criando um novo serviço, pule esta etapa. Se você estiver atualizando um serviço existente, faça o download da configuração YAML correspondente:

    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
    annotations:
      ...
      run.googleapis.com/launch-stage: BETA
      ...
    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:

    • SERVICE pelo nome do serviço em que você quer implantar.
    • APP_IMAGE pelo URL da imagem do contêiner do aplicativo.
    • BASE_IMAGE pelo URL da imagem base, por exemplo, us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20. Análise Imagens de base do ambiente de execução para saber mais sobre as variações da imagem de base.

Refazer a montagem de imagens de contêiner para execução localmente

As imagens de contêiner do aplicativo usadas com atualizações automáticas de imagem de base são criadas em scratch e não podem ser executadas fora do Cloud Run com atualizações de imagem de base ativadas. Para tornar a imagem do aplicativo executável, faça a rebasagem dela em uma imagem de base compatível.

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

  2. Baixe a imagem do aplicativo:

    docker pull APP_IMAGE
    

    Substitua:

    • APP_IMAGE pelo URL da imagem de contêiner.
  3. Faça o download da imagem de base:

    docker pull BASE_IMAGE
    

    Substitua:

    • BASE_IMAGE pelo URL de uma imagem de base compatível. A lista de imagens de base disponíveis pode ser encontrada em Imagens de base dos buildpacks do Google Cloud. Por exemplo, se você criou um aplicativo Node.JS 20 usando a pilha google-22, selecione us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20:latest.
  4. Remonte a imagem:

    Use um Dockerfile para copiar todos os arquivos da imagem do 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 você receber avisos de que ARG ${APP_IMAGE} e ARG ${NEW_BASE_IMAGE} não são imagens de base válidas, ignore-os e execute a imagem:

    docker run -p 8080:8080 IMAGE
    

Desativar atualizações automáticas

Ao implantar da origem

Ao implantar do source, é possível desativar as atualizações automáticas da imagem de base usando a flag --no-automatic-updates. O exemplo a seguir mostra como desativar as atualizações automáticas de imagem de base para um serviço do Node.js:

gcloud

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

Ao implantar uma imagem de contêiner

Para desativar as atualizações de imagem base de um serviço que usa uma imagem de contêiner criada do zero, implante uma nova imagem de contêiner que inclua a imagem base e remova 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 de imagem de base, execute o seguinte comando:

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

    Substitua:

    • SERVICE pelo nome do serviço em que você quer implantar.
    • IMAGE pelo URL da imagem do contêiner que contém o app, o ambiente de execução e o SO.

YAML

  1. Se você estiver criando um novo serviço, pule esta etapa. Se você estiver atualizando um serviço existente, faça o download da configuração YAML correspondente:

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

  3. Exclua o atributo runtimeClassName.

  4. Em image, use uma imagem de contêiner que inclua o app, o ambiente de execução e o SO.

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

    gcloud run services replace service.yaml

Limitações conhecidas

  • As atualizações automáticas de imagem de base só oferecem suporte a imagens de base de buildpacks do Google Cloud. Não é possível usar suas próprias imagens base.

  • Os aplicativos que usam linguagens compiladas não serão recompilados como resultado de um atualização automática da imagem de base.

  • As verificações de segurança na imagem do aplicativo podem estar incompletas. Como a imagem do aplicativo agora foi criada com base no scratch, os verificadores de segurança só vão verificar a parte do aplicativo da imagem. Para ter uma imagem mais completa da segurança do contêiner, você também precisa executar verificações na imagem de base fornecida pelo Google. É possível fazer o download da imagem de base e usar ferramentas de código aberto para executar uma verificação.