Post

Case: POC Docker multi-stage + K8s para Rails

Case: POC Docker multi-stage + K8s para Rails

Contexto

Precisávamos de um modelo rápido para apps Rails que compilasse imagens separadas por ambiente (tst/hmg/prd), já com client Oracle, assets e engines, e que pudesse ser implantado em K8s com job de migração e ingress. Objetivo: acelerar POCs e demos sem reconstruir pipeline do zero.

O que foi feito

  • Dockerfile multi-stage com estágios base/build/tst/hmg/prd: instala Oracle Instant Client, Node/Yarn, clona engines via secret SSH, precompila assets/bootsnap, remove toolchain nos estágios finais e ajusta permissões/usuário.
  • Configuração por ambiente: env.txt indica ambiente; BUNDLE_WITHOUT e RAILS_ENV/NODE_ENV variam por estágio; precompilação paralela e limpeza de cache para imagens menores.
  • Templates K8s: Job de migration + Deployment/Service/Ingress parametrizados (VERSION, DB_*, REDIS_URL, HOST, INGRESS_PATH), com requests/limits e imagePullSecrets.
  • Ferramental: Procfile, configs de DB docker, e orientação para build/push em Azure DevOps/ACR.

Fluxo (simplificado)

flowchart LR
  Code --> Build[Docker build --target tst/hmg/prd\n+ secret SSH]
  Build --> Image[Imagem com assets + Oracle client]
  Image --> K8sJob[Job migrate\nbundle exec rake db:migrate]
  Image --> K8sDeploy[Deployment API]
  K8sDeploy --> SVC[Service 3000]
  SVC --> Ingress[Ingress TLS\npath/host parametrizáveis]

Operação e devX

  • Builds separados por ambiente (--target tst|hmg|prd), com secrets montados só durante o clone das engines.
  • Assets e bootsnap precompilados; toolchain removido nos finais para reduzir superfície e tamanho.
  • Templates K8s permitem trocar versão/host/path sem editar YAMLs; inclui Job de migração na mesma imagem.

Impacto (anonimizado)

  • POCs e demos prontos em horas, com build e deploy reproduzíveis para AKS/K3s.
  • Menos drift entre ambientes: estágios dedicados com configs claras e assets pré-gerados.
  • Pipeline simplificado para times: um Dockerfile e templates K8s cobrem build/run sem depender do monólito original.

O que você pode reutilizar

  • Estrutura de estágios (base/build/tst/hmg/prd) e precompilação com limpeza de cache.
  • Uso de secrets SSH apenas no build, removendo toolchain depois.
  • Templates K8s com Job de migrate acoplado à mesma imagem do app.
Esta postagem está licenciada sob CC BY 4.0 pelo autor.