Neste tutorial, mostramos aos desenvolvedores e operadores que implantam contêineres no Kubernetes como usar resumos de imagens de contêiner para identificar imagens de contêiner. Um resumo de imagem de contêiner identifica uma imagem de contêiner de maneira exclusiva e imutável.
A implantação de imagens de contêiner usando o resumo por imagem oferece vários benefícios em comparação com o uso de tags de imagem. Para mais informações sobre resumos de imagem, consulte o documento complementar sobre como usar resumos de imagem de contêiner antes de continuar este tutorial.
O argumento image para contêineres em uma especificação de pod do Kubernetes aceita
imagens com resumos. Esse argumento se aplica a todos os lugares em que você usa uma
especificação de pod, como na seção template dos recursos Deployment, StatefulSet, DaemonSet,
ReplicaSet, CronJob e Job.
Para implantar uma imagem usando o resumo, use o nome da imagem, seguido por
@sha256: e o valor do resumo. Confira a seguir um exemplo de recurso de implantação
que usa uma imagem com um resumo. Uma implantação é um objeto da API Kubernetes que permite executar várias réplicas de pods distribuídos entre os nós de um cluster.
apiVersion: apps/v1 kind: Deployment metadata: name: echo-deployment spec: selector: matchLabels: app: echo template: metadata: labels: app: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 ports: - containerPort: 8080
Uma desvantagem de usar resumos de imagens é que você só sabe o valor dele depois de publicar a imagem em um registro. À medida que você cria novas imagens, o valor de resumo muda, e é necessário ter uma maneira de atualizar os manifestos do Kubernetes a cada implantação.
Neste tutorial, mostramos como você pode usar ferramentas, como
Skaffold,
kpt,
digester,
kustomize,
gke-deploy
e
ko,
para usar resumos de imagens nos seus manifestos.
Recomendações
Neste documento, apresentamos várias maneiras de usar resumos de imagens
em implantações do Kubernetes. As ferramentas descritas neste documento são complementares.
Por exemplo, use o resultado de uma função kpt com kustomize para criar variantes para ambientes diferentes. O Skaffold pode criar imagens usando ko e implantá-las nos clusters do Kubernetes usando kubectl ou kpt.
As ferramentas são complementares porque executam edições estruturadas com base no modelo de recursos do Kubernetes (KRM, na sigla em inglês). Esse modelo torna as ferramentas conectáveis e é possível evoluir o uso das ferramentas para criar processos e pipelines que ajudam a implantar seus aplicativos e serviços.
Para começar, recomendamos a abordagem que funcione melhor com as ferramentas e os processos atuais:
O Skaffold pode adicionar resumos a referências de imagem. Você ativa essa função com uma pequena alteração na configuração. A adoção do Skaffold oferece benefícios adicionais, como abstrair a forma como diferentes ferramentas criam e implantam imagens de contêiner.
Ao usar a ferramenta de resumo como um webhook de admissão mutante nos clusters do Kubernetes, é possível adicionar resumos a todas as implantações com impacto mínimo nos processos atuais de criação e implantação de imagens de contêiner. O webhook do resumo também simplifica a adoção da autorização binária, porque requer apenas que um rótulo seja adicionado a um namespace.
kpt é uma ótima opção se você precisa de uma ferramenta flexível para manipular manifestos do Kubernetes. A ferramenta de resumo pode ser usada como uma função KRM do lado do cliente em um pipeline kpt.
Se você já usa o kustomize para gerenciar manifestos do Kubernetes em ambientes, recomendamos aproveitar os transformadores de imagem para implantar imagens por resumo.
koé uma ótima maneira de criar e publicar imagens para aplicativos Go e é usado por projetos de código aberto, como o Knative, Tekton e sigstore.
Se você não usar nenhuma das ferramentas descritas neste documento, recomendamos começar com o Skaffold e o webhook do resumo. O Skaffold é uma ferramenta comum usada por desenvolvedores e equipes de lançamento e tem integração com as outras ferramentas descritas neste tutorial. É possível aproveitar essas opções de integração de acordo com a evolução dos seus requisitos. O webhook do resumo do Kubernetes complementa o Skaffold ativando implantações baseadas em resumo para uma cluster inteiro.
Como usar o Skaffold
O Skaffold é uma ferramenta de linha de comando para desenvolvimento contínuo e implantação de aplicativos nos clusters do Kubernetes.
Use o Skaffold para criar uma imagem, enviar a imagem para o Artifact Registry e
substituir o valor do marcador image em um modelo de manifesto do Kubernetes pelo
nome, tag e resumo da imagem enviada:
No Cloud Shell, crie e acesse um diretório para armazenar os arquivos criados nesta seção:
mkdir -p ~/container-image-digests-tutorial/skaffold cd ~/container-image-digests-tutorial/skaffoldClone o repositório do Skaffold Git:
git clone https://github.com/GoogleContainerTools/skaffold.gitAcesse o diretório do exemplo
getting-started:cd skaffold/examples/getting-startedConfira a tag do Git que corresponde à sua versão do Skaffold:
git checkout $(skaffold version)Visualize o arquivo de configuração
skaffold.yaml:cat skaffold.yamlO arquivo é semelhante a este:
apiVersion: skaffold/v4beta6 kind: Config build: artifacts: - image: skaffold-example manifests: rawYaml: - k8s-pod.yaml
A seção
build.artifactscontém um nome de imagem de marcador de posição. O Skaffold procura esse marcador nos arquivos de manifesto de entrada.A seção
manifestsinstrui o Skaffold a ler um manifesto de entrada do diretório atual com o nomek8s-pod.yaml.Para uma visão geral de todas as opções disponíveis, consulte a documentação de referência do
skaffold.yaml.Veja o modelo de manifesto do Kubernetes:
cat k8s-pod.yamlO arquivo é o seguinte:
apiVersion: v1 kind: Pod metadata: name: getting-started spec: containers: - name: getting-started image: skaffold-example
O valor do marcador
skaffold-exampleno campoimagecorresponde ao valor do campoimageno arquivoskaffold.yaml. O Skaffold substitui esse valor de marcador pelo nome completo da imagem e pelo resumo na saída renderizada.Crie e envie a imagem para o Artifact Registry:
skaffold build \ --default-repo=LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY \ --file-output=artifacts.json \ --interactive=false \ --push=true \ --update-check=falseEsse comando usa as seguintes sinalizações:
- A sinalização
--file-outputespecifica o arquivo em que o Skaffold salva informações sobre a imagem criada, incluindo o valor de resumo. - A sinalização
--pushinstrui o Skaffold a enviar a imagem criada ao registro de imagem do contêiner especificado pela sinalização--default-repo. - As sinalizações
--interactivee--update-checkestão definidas comofalse. Defina essas sinalizações comofalseem ambientes não interativos, como pipelines de compilação, mas as deixe com os valores padrão (truepara as duas sinalizações) para desenvolvimento local.
Se você usar o Cloud Deploy para implantar no GKE, use o arquivo a partir da sinalização
--file-outputcomo o valor da sinalização--build-artifactsao criar uma versão.- A sinalização
Renderize o manifesto expandido do Kubernetes com o nome, a tag e o resumo da imagem do contêiner da etapa anterior:
skaffold render \ --build-artifacts=artifacts.json \ --digest-source=none \ --interactive=false \ --offline=true \ --output=rendered.yaml \ --update-check=falseEsse comando usa as seguintes sinalizações:
- A sinalização
--build-artifactsfaz referência ao arquivo de saída do comandoskaffold buildna etapa anterior. - A sinalização
--digest-source=nonesignifica que o Skaffold usa o valor de resumo do arquivo fornecido na sinalização--build-artifactsem vez de resolver o resumo do registro de imagem de contêiner. - A sinalização
--offline=truesignifica que é possível executar o comando sem exigir o acesso a um cluster do Kubernetes. - A sinalização
--outputespecifica o arquivo de saída para o manifesto renderizado.
- A sinalização
Veja o manifesto renderizado:
cat rendered.yamlA saída será assim:
apiVersion: v1 kind: Pod metadata: name: getting-started spec: containers: - image: LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/skaffold-example:TAG@sha256:DIGEST name: getting-started
Nesta saída, os seguintes valores são exibidos:
TAG: a tag que o Skaffold atribuiu à imagem.DIGEST: o valor do resumo da imagem
Como usar o resumo
O resumo adiciona resumos às imagens de contêiner e inicialização do contêiner nas especificações de modelo de pod e pod do Kubernetes. O resumo substitui as referências da imagem do contêiner que usam tags:
spec:
containers:
- image: gcr.io/google-containers/echoserver:1.10
Com referências que usam o resumo de imagens:
spec:
containers:
- image: gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
O resumo pode ser executado como um webhook de admissão mutante em um cluster do Kubernetes ou como uma função KRM do lado do cliente com as ferramentas de linha de comando kpt ou kustomize.
Como usar a função KRM do resumo
No Cloud Shell, crie e acesse um diretório para armazenar os arquivos criados nesta seção:
mkdir -p ~/container-image-digests-tutorial/digester-fn cd ~/container-image-digests-tutorial/digester-fnFaça o download do binário do resumo:
mkdir -p ${HOME}/bin export PATH=${HOME}/bin:${PATH} DIGESTER_VERSION=$(curl -sL https://api.github.com/repos/google/k8s-digester/releases/latest | jq -r .tag_name) curl -L "https://github.com/google/k8s-digester/releases/download/${DIGESTER_VERSION}/digester_$(uname -s)_$(uname -m)" --output ${HOME}/bin/digester chmod +x ${HOME}/bin/digesterCrie um manifesto de pod do Kubernetes que faça referência à imagem
gcr.io/google-containers/echoserverusando a tag1.10:cat << EOF > pod.yaml apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 ports: - containerPort: 8080 EOFExecute a função KRM do resumo usando o kpt com os manifestos no diretório atual (
.):kpt fn eval . --exec digesterQuando você executa esse comando, o kpt executa uma atualização no local dos manifestos no diretório atual. Se você quiser que o kpt mostre o manifesto atualizado no console e deixe o arquivo de manifesto inalterado, adicione a sinalização
--output unwrap.Veja o manifesto atualizado:
cat pod.yamlO arquivo é o seguinte:
apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 ports: - containerPort: 8080
Como usar o webhook de admissão do resumo
No Cloud Shell, crie e acesse um diretório para armazenar os arquivos criados nesta seção:
mkdir -p ~/container-image-digests-tutorial/digester-webhook cd ~/container-image-digests-tutorial/digester-webhookCrie um cluster local do Kubernetes usando kind:
kind create clusterO Kind é uma ferramenta de linha de comando para executar clusters locais do Kubernetes usando o Docker.
Implante o webhook do resumo:
DIGESTER_VERSION=$(curl -sL https://api.github.com/repos/google/k8s-digester/releases/latest | jq -r .tag_name) kustomize build "https://github.com/google/k8s-digester.git/manifests?ref=${DIGESTER_VERSION}" | kubectl apply -f -Crie um namespace do Kubernetes chamado
digester-demono cluster de tipo:kubectl create namespace digester-demoAdicione o rótulo
digest-resolution: enabledao namespacedigester-demo:kubectl label namespace digester-demo digest-resolution=enabledO webhook do resumo adiciona resumos aos pods nos namespaces com esse rótulo.
Crie um manifesto de implantação do Kubernetes que faça referência à imagem
gcr.io/google-containers/echoserverusando a tag1.10:cat << EOF > deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: echo-deployment spec: selector: matchLabels: app: echo template: metadata: labels: app: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 ports: - containerPort: 8080 EOFAplique o manifesto no namespace
digester-demo:kubectl apply --filename deployment.yaml --namespace digester-demo \ --output jsonpath='{.spec.template.spec.containers[].image}{"\n"}'A sinalização
--outputinstruikubectla enviar o nome da imagem para o console, seguido por um caractere de nova linha. A saída é esta:gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229Esta saída mostra que o webhook do resumo adicionou o resumo da imagem à especificação do modelo do pod no recurso de implantação.
Exclua o cluster de tipo para liberar recursos na sessão do Cloud Shell:
kind delete cluster
Como usar setters kpt
O kpt é uma ferramenta de linha de comando para gerenciar, manipular, personalizar e aplicar manifestos de recursos do Kubernetes.
É possível usar as funções KRM create-setters e apply-setters do Catálogo de funções kpt para atualizar os resumos de imagem nos manifestos do Kubernetes ao criar novas imagens.
No Cloud Shell, crie e acesse um diretório para armazenar os arquivos criados nesta seção:
mkdir -p ~/container-image-digests-tutorial/kpt cd ~/container-image-digests-tutorial/kptCrie um pacote kpt no diretório atual:
kpt pkg init --description "Container image digest tutorial"Crie um manifesto de pod do Kubernetes que faça referência à imagem
gcr.io/google-containers/echoserverusando a tag1.10:cat << EOF > pod.yaml apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 ports: - containerPort: 8080 EOFUse o kpt para criar um setter chamado
echoimagepara o campo do manifesto, em que o valor atual égcr.io/google-containers/echoserver:1.10:kpt fn eval . \ --image gcr.io/kpt-fn/create-setters@sha256:0220cc87f29ff9abfa3a3b5643aa50f18d355d5e9dc9e1f518119633ddc4895c \ -- "echoimage=gcr.io/google-containers/echoserver:1.10"Veja o manifesto:
cat pod.yamlO arquivo é o seguinte:
apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 # kpt-set: ${echoimage} ports: - containerPort: 8080
Para receber o valor de resumo da imagem do contêiner:
DIGEST=$(gcloud container images describe \ gcr.io/google-containers/echoserver:1.10 \ --format='value(image_summary.digest)')Defina o novo valor do campo:
kpt fn eval . \ --image gcr.io/kpt-fn/apply-setters@sha256:4d4295727183396f0c3c6a75d2560254c2f9041a39e95dc1e5beffeb49cc1a12 \ -- "echoimage=gcr.io/google-containers/echoserver:1.10@$DIGEST"Ao executar esse comando, o kpt realiza uma substituição no local do valor do campo
imageno manifesto.Veja o manifesto atualizado:
cat pod.yamlO arquivo é o seguinte:
apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 # kpt-set: ${echoimage} ports: - containerPort: 8080
Como usar transformadores de imagem do Kustomize
O kustomize é uma ferramenta de linha de comando que permite personalizar manifestos do Kubernetes usando sobreposições, patches e transformadores.
Use o transformador de imagens do kustomize para atualizar o nome, a tag e o resumo da imagem no manifesto atual.
O snippet kustomization.yaml a seguir mostra como configurar o transformador de imagem
para usar o valor digest do transformador para imagens em que o valor image da especificação do pod
corresponde ao valor name do transformador:
images: - name: gcr.io/google-containers/echoserver digest: sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
Para usar um transformador de imagem do kustomize com um resumo de imagem, faça o seguinte:
No Cloud Shell, crie e acesse um diretório para armazenar os arquivos criados nesta seção:
mkdir -p ~/container-image-digests-tutorial/kustomize cd ~/container-image-digests-tutorial/kustomizeCrie um arquivo
kustomization.yaml:kustomize initCrie um manifesto do Kubernetes com uma especificação de pod que referencie a imagem
gcr.io/google-containers/echoserverusando a tag1.10:cat << EOF > pod.yaml apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 ports: - containerPort: 8080 EOFAdicione o manifesto como um recurso no arquivo
kustomization.yaml:kustomize edit add resource pod.yamlUse um transformador de imagem para atualizar o resumo da imagem:
kustomize edit set image \ gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229Visualize o transformador de imagens no arquivo
kustomization.yaml:cat kustomization.yamlO arquivo é o seguinte:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - pod.yaml images: - digest: sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 name: gcr.io/google-containers/echoserver
Visualize o manifesto resultante:
kustomize build .A saída é esta:
apiVersion: v1 kind: Pod metadata: name: echo spec: containers: - image: gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 name: echoserver ports: - containerPort: 8080
Para executar o transformador kustomize e aplicar o manifesto resultante a um cluster do Kubernetes em uma única etapa, use o comando
kubectl applycom a sinalização--kustomize:kubectl apply --kustomize .Se você quiser aplicar a saída posteriormente, poderá redirecionar a saída do comando
kustomize buildpara um arquivo.
Como usar o gke-deploy
gke-deploy é uma ferramenta de linha de comando que você usa com o Google Kubernetes Engine (GKE).
O gke-deploy encapsula a ferramenta de linha de comando kubectl e pode modificar os recursos criados seguindo as práticas recomendadas do Google.
Se você usa os subcomandos gke-deploy prepare ou run, gke-deploy
resolve suas tags de imagem para resumir e salva os manifestos expandidos com os
resumos de imagem no arquivo output/expanded/aggregated-resources.yaml por
padrão.
Use gke-deploy run para substituir a tag de imagem por um resumo e
aplicar o manifesto expandido ao cluster do GKE. Esse comando
é conveniente, mas há uma desvantagem: a tag de imagem é substituída no
momento da implantação. A imagem associada à tag pode ter sido alterada entre
o momento em que você decidiu implantá-la e quando foi implantada, resultando na
implantação de uma imagem inesperada. Para implantações de produção, recomendamos etapas
separadas para gerar e aplicar manifestos.
Para substituir uma tag de imagem em um manifesto de implantação do Kubernetes pelo resumo da imagem, faça o seguinte:
No Cloud Shell, crie e acesse um diretório para armazenar os arquivos criados nesta seção:
mkdir -p ~/container-image-digests-tutorial/gke-deploy cd ~/container-image-digests-tutorial/gke-deployInstale
gke-deploy:go install github.com/GoogleCloudPlatform/cloud-builders/gke-deploy@latestCrie um manifesto de implantação do Kubernetes que faça referência à imagem
gcr.io/google-containers/echoserverusando a tag1.10:cat << EOF > deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: echo-deployment spec: selector: matchLabels: app: echo template: metadata: labels: app: echo spec: containers: - name: echoserver image: gcr.io/google-containers/echoserver:1.10 ports: - containerPort: 8080 EOFGere um manifesto expandido com base no manifesto
deployment.yaml:gke-deploy prepare \ --filename deployment.yaml \ --image gcr.io/google-containers/echoserver:1.10 \ --version 1.10Veja o manifesto expandido:
cat output/expanded/aggregated-resources.yamlA saída é esta:
apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/managed-by: gcp-cloud-build-deploy app.kubernetes.io/version: "1.10" name: echo-deployment namespace: default spec: selector: matchLabels: app: echo template: metadata: labels: app: echo app.kubernetes.io/managed-by: gcp-cloud-build-deploy app.kubernetes.io/version: "1.10" spec: containers: - image: gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 name: echoserver ports: - containerPort: 8080
No manifesto expandido, a tag de imagem é substituída pelo resumo.
O argumento
--versionusado com o comandogke-deploydefine o valor do rótuloapp.kubernetes.io/versionna implantação e nos metadados do modelo de pod do manifesto expandido.Para saber como usar
gke-deploycom o Cloud Build, consulte a documentação do Cloud Build paragke-deploy.
Como usar o ko
ko
é uma ferramenta de linha de comando e biblioteca para criar
imagens de contêiner Go
e implantá-las em clusters do Kubernetes. ko cria imagens
sem usar o daemon do Docker para que seja possível usá-lo em ambientes em que não
é possível instalar o Docker.
O subcomando ko
build
cria imagens e as publica em um registro de imagem de contêiner ou as carrega no seu
daemon do Docker local.
O subcomando ko
resolve
faz o seguinte:
- Identifica as imagens a serem criadas encontrando marcadores nos campos
imagedos manifestos do Kubernetes fornecidos usando o argumento--filename. - Cria e publica imagens.
- Substitui os marcadores de valor
imagepelos nomes e resumos das imagens criadas. - Imprime os manifestos expandidos.
Os subcomandos
ko apply,
create
e
run
executam as mesmas etapas que resolve e, em seguida, executam kubectl apply,
create ou run com os manifestos expandidos.
Para criar uma imagem a partir do código-fonte Go e adicionar o resumo da imagem a um manifesto de implantação do Kubernetes, faça o seguinte:
No Cloud Shell, crie e acesse um diretório para armazenar os arquivos criados nesta seção:
mkdir -p ~/container-image-digests-tutorial/ko cd ~/container-image-digests-tutorial/koFaça o download de
koe adicione-o ao seuPATH:mkdir -p ${HOME}/bin export PATH=${HOME}/bin:${PATH} KO_VERSION=$(curl -sL https://api.github.com/repos/ko-build/ko/releases/latest | jq -r .tag_name | cut -c2-) curl -L "https://github.com/ko-build/ko/releases/download/v${KO_VERSION}/ko_${KO_VERSION}_$(uname -s)_$(uname -m).tar.gz" | tar -zxC ${HOME}/bin koCrie um aplicativo Go com o nome do módulo
example.com/hello-worldem um novo diretório chamadoapp:mkdir -p app/cmd/ko-example cd app go mod init example.com/hello-world cat << EOF > cmd/ko-example/main.go package main import "fmt" func main() { fmt.Println("hello world") } EOFDefina o repositório de imagens que o
kousa para publicar imagens:export KO_DOCKER_REPO=LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORYNeste exemplo, usamos o Artifact Registry, mas é possível usar o
kocom um registro de imagens de contêiner diferente.Para criar e publicar uma imagem para o aplicativo, siga um destes procedimentos:
Crie e publique uma imagem para o aplicativo fornecendo o caminho para seu pacote principal do Go:
ko build --base-import-paths ./cmd/ko-exampleO argumento opcional
--base-import-pathssignifica quekousa o nome abreviado do diretório do pacote principal como o nome da imagem.koimprime o nome da imagem e o resumo parastdoutno seguinte formato:LOCATION-docker.pkg.dev/PROJECT_ID/ko-example@sha256:DIGESTNessa saída,
DIGESTé o valor de resumo da imagem.Use
kopara substituir um marcador de manifesto pelo nome e resumo da imagem que ela cria e publica:Crie um manifesto de pod do Kubernetes. O manifesto usa o marcador
ko://IMPORT_PATH_OF_YOUR_MAIN_PACKAGEcomo valor do campoimage:cat << EOF > ko-pod.yaml apiVersion: v1 kind: Pod metadata: name: ko-example spec: containers: - name: hello-world image: ko://example.com/hello-world/cmd/ko-example EOFCrie e publique uma imagem para o aplicativo e substitua o marcador de posição do manifesto pelo nome e resumo da imagem:
ko resolve --base-import-paths --filename ko-pod.yamlkoimprime o manifesto com o nome da imagem e um resumo parastdout:apiVersion: v1 kind: Pod metadata: name: ko-example spec: containers: - name: hello-world image: LOCATION-docker.pkg.dev/PROJECT_ID/ko-example@sha256:DIGEST
Nessa saída,
DIGESTé o valor de resumo da imagem.