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.
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.
- Usar o implante da origem do Cloud Run (recomendado)
- Usando um sistema de build, copie seu aplicativo em uma imagem
scratch
.
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:
- Crie um Dockerfile com vários estágios que:
- Cria o aplicativo usando uma imagem de base adequada com as dependências necessárias.
- Copia os componentes criados em uma imagem de scratch.
- Crie a imagem do contêiner do aplicativo e envie-a para o Artifact Registry.
- 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
-
In the Google Cloud console, 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.
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
ouus-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
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
Atualize
runtimeClassName
e as anotaçõesrun.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.
Instale o Docker Community Edition (CE) na estação de trabalho.
Baixe a imagem do aplicativo:
docker pull APP_IMAGE
Substitua:
- APP_IMAGE pelo URL da imagem de contêiner.
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
, selecioneus-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20:latest
.
- 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
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}
eARG ${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
-
In the Google Cloud console, 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.
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
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
Exclua a anotação
run.googleapis.com/base-images
.Exclua o atributo
runtimeClassName
.Em
image
, use uma imagem de contêiner que inclua o app, o ambiente de execução e o SO.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.