Este guia orienta todo o ciclo de vida das imagens base mantidas no repositório, desde o planejamento até a entrega contínua. Ele consolida boas práticas internas e recomendações de segurança para Dockerfiles, ambientes de build e execução.
- Definir stack, versão e requisitos de hardening para a imagem.
- Mapear variáveis obrigatórias, opcionais e padrões seguros.
- Registrar decisões relevantes (por exemplo, em ADR) e atualizar o
CHANGELOG.
postgres-16-dev: variante baseada na imagem oficial do PostgreSQL para desenvolvimento.postgres-16-hardened: variante Hardened (Docker Hardened Images) destinada a ambientes produtivos.- Base construída a partir do espelho privado/publicado em
cginfseges/dhi-postgres:16-alpine3.22, garantindo acesso sem depender do registry original.
- Base construída a partir do espelho privado/publicado em
- Criar
images/<nome-da-imagem>/contendo ao menosDockerfile. - Para variantes (ex.:
postgres-16-dev,postgres-16-hardened), prefira diretórios separados por público-alvo ou nível de hardening. - Adicionar
README.mdespecífico da imagem com instruções de uso e variáveis. - Incluir scripts auxiliares (entrypoint, healthchecks) e exemplos em subpastas dedicadas.
- Preferir imagens minimalistas (Alpine, distroless) ou oficiais verificadas.
- Avaliar disponibilização em pares (ex.: oficial para dev e Hardened para produção) quando a segurança exigir.
- Utilizar multi-stage build quando houver toolchain na fase de build.
- Atualizar pacotes, remover caches temporários e fixar versões de dependências.
- Documentar motivação de dependências adicionais e revisar tamanho final.
- Declarar
ARGpara dados de build (ex.:BUILD_DATE,VCS_REF) eENVpara runtime. - Fornecer
.env.exampleou tabela no README com descrição e valores padrão. - Validar variáveis críticas no entrypoint antes de iniciar o serviço.
- Evitar colocar segredos diretamente na imagem; consumir via secrets/volumes.
- Criar usuário/grupo não privilegiados específicos da imagem.
- Ajustar permissões com
chown/chmodapenas onde necessário. - Finalizar o Dockerfile com
USER <nome>para impedir execução como root. - Na execução, considerar
--cap-drop=ALLe adicionar capacidades estritamente necessárias.
- Definir diretórios persistentes (ex.:
/var/lib/app/data) e documentar seu uso. - Declarar
VOLUMEsomente quando inevitável; preferir instruções no README para composição viadocker-composeou orchestrators. - Garantir que permissões nesses diretórios correspondam ao usuário não-root.
- Armazenar configurações padrão em
/etc/<app>/ou diretório equivalente. - Permitir overrides com arquivos montados ou variáveis processadas (
envsubst, scripts). - Validar integridade de arquivos de configuração antes de iniciar o serviço.
- Implementar
ENTRYPOINTidempotente, com tratamento de sinais (exec "$@"). - Usar
CMDpara definir o processo principal e oferecer override simples. - Garantir que scripts sejam compatíveis com shell POSIX e executáveis (
chmod +x).
- Redirecionar logs para
stdout/stderr. - Expor configurações de log via variáveis (
LOG_LEVEL,LOG_FORMAT). - Documentar endpoints de métricas ou healthchecks.
- Remover ferramentas desnecessárias e pacotes temporários após uso.
- Adicionar labels OCI (
org.opencontainers.image.*) com maintainer, commit e link para política de segurança. - Preferir
COPYem vez deADD; realizar downloads dentro deRUNcom validação (hash, TLS). - Considerar filesystem read-only (
--read-only) e--security-opt no-new-privileges:truenas execuções. - Referências externas:
- Disponibilizar comandos
make build,make testou scripts equivalentes. - Realizar smoke tests pós-build (
docker run --rm <imagem> --versionou healthcheck). - Validar permissões e mounts simulando cenários de produção.
- Assegurar cobertura do workflow de build multi-arquitetura e publicação no GHCR.
- Habilitar scanners (Trivy, Docker Scout) e linters (Hadolint) na pipeline.
- Planejar assinatura e verificação de imagens (Sigstore/Notary) para etapas futuras.
- Publicar resultados (ex.: relatórios SARIF/HTML) como artefatos e resumos do workflow.
- Atualizar README da imagem com variáveis, exemplos de
docker rune troubleshooting. - Registrar notas de upgrade e breaking changes.
- Manter checklist de revisão antes de abrir PR (lint, testes, atualização de labels).
- Programar rebuild periódico das imagens para incorporar patches.
- Monitorar CVEs críticos e end-of-life da distribuição base.
- Revisar permissões de registry, políticas de deploy e dependências do pipeline.
Este roteiro deve ser revisado periodicamente para refletir novas práticas de segurança e lições aprendidas nos projetos que consomem as imagens base do repositório.