Chainguard Images
Imagens de contêiner mínimas com zero CVE construídas no Wolfi Linux para cadeias de suprimento de software seguras.
Primeiros Passos
Seção intitulada “Primeiros Passos”Baixando Imagens
Seção intitulada “Baixando Imagens”| Comando | Descrição |
|---|---|
docker pull cgr.dev/chainguard/static:latest | Baixar imagem base estática mínima |
docker pull cgr.dev/chainguard/busybox:latest | Baixar imagem busybox para depuração |
docker pull cgr.dev/chainguard/wolfi-base:latest | Baixar imagem base Wolfi com shell |
docker pull cgr.dev/chainguard/python:latest | Baixar imagem runtime Python |
docker pull cgr.dev/chainguard/node:latest | Baixar imagem runtime Node.js |
docker pull cgr.dev/chainguard/go:latest | Baixar imagem de build Go |
docker pull cgr.dev/chainguard/nginx:latest | Baixar imagem do servidor web nginx |
docker pull cgr.dev/chainguard/git:latest | Baixar imagem git mínima |
docker pull cgr.dev/chainguard/jdk:latest | Baixar imagem Java JDK |
docker pull cgr.dev/chainguard/rust:latest | Baixar imagem de build Rust |
docker pull cgr.dev/chainguard/redis:latest | Baixar imagem do servidor Redis |
docker pull cgr.dev/chainguard/postgres:latest | Baixar imagem PostgreSQL |
docker pull cgr.dev/chainguard/curl:latest | Baixar imagem curl mínima |
Tags de Imagem
Seção intitulada “Tags de Imagem”| Comando | Descrição |
|---|---|
tag :latest | Build mais recente, pronto para produção |
tag :latest-dev | Variante de desenvolvimento com shell e gerenciador de pacotes |
:latest em imagens -dev | Inclui apk, shell e ferramentas de depuração |
cgr.dev/chainguard-private/IMAGE | Registro de imagens privado/empresarial |
Fixação por digest @sha256:abc123... | Fixar ao build exato da imagem para reprodutibilidade |
Uso de Imagens
Seção intitulada “Uso de Imagens”Uso Básico
Seção intitulada “Uso Básico”| Comando | Descrição |
|---|---|
FROM cgr.dev/chainguard/static:latest | Usar imagem estática no Dockerfile |
FROM cgr.dev/chainguard/python:latest-dev | Usar variante dev com pip e shell |
FROM cgr.dev/chainguard/node:latest AS build | Usar como estágio de build |
FROM cgr.dev/chainguard/go:latest AS builder | Usar imagem Go para compilação |
docker run --rm cgr.dev/chainguard/wolfi-base sh | Executar shell interativo |
docker run --rm -p 8080:8080 cgr.dev/chainguard/nginx | Executar servidor nginx |
docker run --rm cgr.dev/chainguard/python -- python -c "print('hello')" | Executar one-liner Python |
Build Go Multi-Estágio
Seção intitulada “Build Go Multi-Estágio”# Estágio de build
FROM cgr.dev/chainguard/go:latest AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o /server ./cmd/server
# Estágio de runtime - distroless, sem shell, sem gerenciador de pacotes
FROM cgr.dev/chainguard/static:latest
COPY --from=builder /server /server
EXPOSE 8080
ENTRYPOINT ["/server"]
Build Python Multi-Estágio
Seção intitulada “Build Python Multi-Estágio”# Estágio de build com pip disponível
FROM cgr.dev/chainguard/python:latest-dev AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --prefix=/install -r requirements.txt
COPY . .
# Estágio de runtime - Python mínimo, sem pip, sem shell
FROM cgr.dev/chainguard/python:latest
COPY --from=builder /install /usr/local
COPY --from=builder /app /app
WORKDIR /app
ENTRYPOINT ["python", "-m", "myapp"]
Build Node.js Multi-Estágio
Seção intitulada “Build Node.js Multi-Estágio”# Estágio de build
FROM cgr.dev/chainguard/node:latest-dev AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# Estágio de runtime
FROM cgr.dev/chainguard/node:latest
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
EXPOSE 3000
ENTRYPOINT ["node", "dist/index.js"]
Build Java Multi-Estágio
Seção intitulada “Build Java Multi-Estágio”# Estágio de build
FROM cgr.dev/chainguard/jdk:latest-dev AS builder
WORKDIR /app
COPY . .
RUN ./gradlew build --no-daemon -x test
# Estágio de runtime
FROM cgr.dev/chainguard/jre:latest
COPY --from=builder /app/build/libs/app.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
Descoberta
Seção intitulada “Descoberta”Operações Chainctl
Seção intitulada “Operações Chainctl”| Comando | Descrição |
|---|---|
chainctl auth login | Autenticar com Chainguard |
chainctl auth login --headless | Login em ambientes headless |
chainctl auth configure-docker | Configurar Docker para usar o registro Chainguard |
chainctl images list | Listar imagens Chainguard disponíveis |
chainctl images repos list --group=GROUP_ID | Listar repos de imagens de um grupo |
chainctl images diff IMAGE1 IMAGE2 | Comparar duas versões de imagem |
chainctl images history cgr.dev/chainguard/python | Mostrar histórico de versões da imagem |
Navegar em images.chainguard.dev | Catálogo web de todas as imagens |
Inspeção de Imagens
Seção intitulada “Inspeção de Imagens”| Comando | Descrição |
|---|---|
crane ls cgr.dev/chainguard/python | Listar tags disponíveis para uma imagem |
crane manifest cgr.dev/chainguard/python:latest | Visualizar manifesto da imagem |
crane config cgr.dev/chainguard/python:latest | Visualizar configuração da imagem |
docker inspect cgr.dev/chainguard/python:latest | Inspecionar metadados da imagem |
docker history cgr.dev/chainguard/python:latest | Visualizar camadas da imagem |
dive cgr.dev/chainguard/python:latest | Explorar camadas da imagem interativamente |
Verificação
Seção intitulada “Verificação”Verificação de Assinatura
Seção intitulada “Verificação de Assinatura”| Comando | Descrição |
|---|---|
cosign verify --certificate-oidc-issuer=https://token.actions.githubusercontent.com --certificate-identity-regexp='chainguard' cgr.dev/chainguard/python | Verificar assinatura da imagem |
cosign verify-attestation --type spdx cgr.dev/chainguard/python | Verificar atestado SBOM |
cosign verify-attestation --type vuln cgr.dev/chainguard/python | Verificar atestado de vulnerabilidade |
cosign tree cgr.dev/chainguard/python | Visualizar artefatos da cadeia de suprimentos |
cosign verify-attestation --type slsaprovenance cgr.dev/chainguard/python | Verificar proveniência SLSA |
Exemplo de Verificação Cosign
Seção intitulada “Exemplo de Verificação Cosign”# Verificar a assinatura de uma imagem Chainguard
cosign verify \
--certificate-oidc-issuer="https://token.actions.githubusercontent.com" \
--certificate-identity-regexp="chainguard" \
cgr.dev/chainguard/python:latest
# Verificar atestado SBOM e exibi-lo
cosign verify-attestation \
--type spdx \
--certificate-oidc-issuer="https://token.actions.githubusercontent.com" \
--certificate-identity-regexp="chainguard" \
cgr.dev/chainguard/python:latest | jq -r '.payload' | base64 -d | jq .
# Verificar atestado de varredura de vulnerabilidade
cosign verify-attestation \
--type vuln \
--certificate-oidc-issuer="https://token.actions.githubusercontent.com" \
--certificate-identity-regexp="chainguard" \
cgr.dev/chainguard/python:latest
Varredura de Vulnerabilidades
Seção intitulada “Varredura de Vulnerabilidades”| Comando | Descrição |
|---|---|
grype cgr.dev/chainguard/python | Varrer imagem para vulnerabilidades com Grype |
grype cgr.dev/chainguard/python --only-fixed | Mostrar apenas vulnerabilidades corrigíveis |
trivy image cgr.dev/chainguard/python | Varrer com scanner Trivy |
trivy image --severity HIGH,CRITICAL cgr.dev/chainguard/python | Varrer apenas alta/crítica |
docker scout cves cgr.dev/chainguard/python | Varrer com Docker Scout |
chainctl images vulns cgr.dev/chainguard/python | Ver vulnerabilidades conhecidas via chainctl |
Gerenciamento APK Wolfi
Seção intitulada “Gerenciamento APK Wolfi”Operações de Pacotes
Seção intitulada “Operações de Pacotes”| Comando | Descrição |
|---|---|
apk update | Atualizar índice de pacotes (em imagens dev) |
apk add curl | Instalar um pacote |
apk add --no-cache python3 py3-pip | Instalar sem cache de índice |
apk add --virtual .build-deps gcc musl-dev | Instalar dependências de build virtuais |
apk del .build-deps | Remover grupo de pacotes virtuais |
apk del curl | Remover um pacote |
apk list --installed | Listar pacotes instalados |
apk search nginx | Buscar pacotes disponíveis |
apk info python3 | Mostrar detalhes do pacote |
apk info -L python3 | Listar arquivos de um pacote |
Construindo Imagens Personalizadas
Seção intitulada “Construindo Imagens Personalizadas”Build de Pacotes Melange
Seção intitulada “Build de Pacotes Melange”| Comando | Descrição |
|---|---|
melange keygen | Gerar chaves de assinatura para pacotes |
melange build recipe.yaml --signing-key melange.rsa | Construir pacote APK a partir de receita |
melange build recipe.yaml --arch x86_64,aarch64 | Construir para múltiplas arquiteturas |
melange bump recipe.yaml 1.2.3 | Incrementar versão na receita |
Exemplo de Receita Melange
Seção intitulada “Exemplo de Receita Melange”package:
name: myapp
version: 1.0.0
epoch: 0
description: Aplicação personalizada
copyright:
- license: Apache-2.0
environment:
contents:
packages:
- build-base
- go
- ca-certificates-bundle
pipeline:
- uses: git-checkout
with:
repository: https://github.com/org/myapp
tag: v${{package.version}}
- uses: go/build
with:
packages: ./cmd/myapp
output: myapp
ldflags: -s -w
- uses: strip
Build de Imagens Apko
Seção intitulada “Build de Imagens Apko”| Comando | Descrição |
|---|---|
apko build config.yaml tag output.tar | Construir imagem OCI a partir de config YAML |
apko publish config.yaml tag | Construir e enviar imagem para registro |
apko build config.yaml tag output.tar --arch x86_64,aarch64 | Construir imagem multi-arquitetura |
docker load < output.tar | Carregar imagem construída no Docker |
Exemplo de Configuração Apko
Seção intitulada “Exemplo de Configuração Apko”contents:
packages:
- ca-certificates-bundle
- wolfi-baselayout
- myapp
repositories:
- https://packages.wolfi.dev/os
- /path/to/local/packages
accounts:
groups:
- groupname: nonroot
gid: 65532
users:
- username: nonroot
uid: 65532
gid: 65532
run-as: 65532
entrypoint:
command: /usr/bin/myapp
archs:
- x86_64
- aarch64
environment:
APP_ENV: production
PORT: "8080"
SBOM e Proveniência
Seção intitulada “SBOM e Proveniência”Artefatos da Cadeia de Suprimentos
Seção intitulada “Artefatos da Cadeia de Suprimentos”| Comando | Descrição |
|---|---|
cosign download sbom cgr.dev/chainguard/python | Baixar SBOM da imagem |
syft cgr.dev/chainguard/python | Gerar SBOM com Syft |
syft cgr.dev/chainguard/python -o spdx-json | Gerar SBOM SPDX |
syft cgr.dev/chainguard/python -o cyclonedx-json | Gerar SBOM CycloneDX |
cosign download attestation cgr.dev/chainguard/python | Baixar todos os atestados |
cosign verify-attestation --type slsaprovenance cgr.dev/chainguard/python | Verificar proveniência SLSA |
chainctl images vulns cgr.dev/chainguard/python | Ver vulnerabilidades conhecidas |
Aplicação de Políticas
Seção intitulada “Aplicação de Políticas”Política de Admissão Kubernetes
Seção intitulada “Política de Admissão Kubernetes”# Sigstore Policy Controller - exigir assinaturas Chainguard
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
name: require-chainguard-signatures
spec:
images:
- glob: "cgr.dev/chainguard/**"
- glob: "cgr.dev/chainguard-private/**"
authorities:
- keyless:
url: https://fulcio.sigstore.dev
identities:
- issuerRegExp: ".*"
subjectRegExp: ".*chainguard.*"
ctlog:
url: https://rekor.sigstore.dev
Exemplo de Política Kyverno
Seção intitulada “Exemplo de Política Kyverno”apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-chainguard-images
spec:
validationFailureAction: Enforce
background: true
rules:
- name: check-image-registry
match:
any:
- resources:
kinds:
- Pod
validate:
message: "Apenas imagens Chainguard de cgr.dev são permitidas."
pattern:
spec:
containers:
- image: "cgr.dev/chainguard/*"
initContainers:
- image: "cgr.dev/chainguard/*"
Pipeline de Verificação CI/CD
Seção intitulada “Pipeline de Verificação CI/CD”# GitHub Actions - verificar e varrer antes da implantação
name: Image Verification
on:
push:
branches: [main]
jobs:
verify:
runs-on: ubuntu-latest
steps:
- name: Install cosign
uses: sigstore/cosign-installer@v3
- name: Verify image signature
run: |
cosign verify \
--certificate-oidc-issuer="https://token.actions.githubusercontent.com" \
--certificate-identity-regexp="chainguard" \
cgr.dev/chainguard/python:latest
- name: Scan for vulnerabilities
uses: anchore/grype-action@v0
with:
image: cgr.dev/chainguard/python:latest
fail-on: high
Melhores Práticas
Seção intitulada “Melhores Práticas”-
Usar builds multi-estágio — construir em imagens
-dev(que possuem compiladores e gerenciadores de pacotes) e copiar apenas o artefato final para a imagem runtime mínima. -
Fixar imagens por digest — usar digests
@sha256:...em vez de tags para implantações em produção para garantir reprodutibilidade. -
Escolher a imagem base correta — usar
staticpara binários compilados sem dependências de SO,wolfi-basequando precisar de shell, e imagens específicas de linguagem para linguagens interpretadas. -
Verificar assinaturas no CI/CD — sempre verificar assinaturas de imagens Chainguard com cosign antes de construir ou implantar.
-
Varrer mesmo imagens zero-CVE — executar varreduras de vulnerabilidade como etapa de validação; imagens Chainguard devem retornar zero resultados, confirmando que seu pipeline está usando imagens genuínas.
-
Usar variantes
-devapenas em estágios de build — nunca envie imagens-devpara produção; elas incluem ferramentas que aumentam a superfície de ataque. -
Executar como nonroot — imagens Chainguard usam por padrão o usuário nonroot; mantenha isso em seus Dockerfiles não alternando para root.
-
Aplicar políticas de imagem — usar Kyverno, OPA Gatekeeper ou Sigstore Policy Controller para restringir registros de contêiner em seus clusters.
-
Gerar e armazenar SBOMs — usar Syft ou cosign para baixar SBOMs para conformidade e trilhas de auditoria.
-
Manter imagens atualizadas — Chainguard reconstrói imagens frequentemente; atualize seus digests regularmente para obter os patches de segurança mais recentes.