Skip to content

Templates de Build Docker

O repositório ads-automations fornece três templates de Dockerfile que padronizam o build de todas as aplicações. Cada template usa multi-stage build de 3 estágios para otimizar cache e tamanho da imagem final.

Dockerfile-java (Java Genérico)

Template padrão para aplicações Java/Spring Boot com módulo único.

Estágios

flowchart LR
    A[dependencies<br/>maven:3.9.9-eclipse-temurin] -->|Copia pom.xml<br/>mvn dependency:resolve| B[build<br/>Copia source<br/>mvn clean package]
    B -->|Copia app.jar| C[runtime<br/>openjdk-slim<br/>Porta 6001]
Estágio Base Image O que faz
dependencies maven:3.9.9-eclipse-temurin-{JAVA_VERSION} Copia pom.xml e resolve dependências Maven (cache-friendly)
build Reutiliza dependencies Copia código-fonte, executa mvn clean package -DskipTests, renomeia JAR para app.jar
runtime openjdk:{JAVA_VERSION}-slim Imagem mínima, instala ferramentas de debug, timezone America/Fortaleza

Build ARGs

ARG Default Descrição
JAVA_VERSION 21 Versão do JDK

Entrypoint

bash java $JAVA_OPTS -server -jar app.jar --spring.datasource.hikari.poolName=${POOL_NAME}

  • JAVA_OPTS: Configuração de JVM (memória, GC) via variável de ambiente
  • POOL_NAME: Nome do pool de conexões HikariCP (identificação por tenant)
  • Porta exposta: 6001

Dockerfile-is-core-api (Java Multi-módulo)

Variante para projetos Maven com múltiplos módulos (api/ + models/).

Diferenças em relação ao template genérico

Aspecto Genérico Multi-módulo
Estrutura Módulo único api/ + models/
Dependências mvn dependency:resolve mvn dependency:go-offline
Build mvn clean package mvn clean install
Diretórios extras Nenhum Cria dirs para file storage
Porta 6001 6003

Uso

Projetos que possuem submódulos Maven (como is-core-api com módulos api e models) devem usar este template. Os pom.xml de cada módulo são copiados separadamente no estágio de dependências.

Dockerfile-node (Angular/Node)

Template para aplicações Angular servidas via Nginx.

Estágios

flowchart LR
    A[dependencies<br/>node:18<br/>npm install] -->|node_modules| B[build<br/>Copia source<br/>npm run build --prod]
    B -->|dist/| C[runtime<br/>nginx:alpine<br/>Porta 80]
Estágio Base Image O que faz
dependencies node:18 Copia package*.json, executa npm install --legacy-peer-deps
build Reutiliza dependencies Copia configs Angular + source, executa npm run build --prod
runtime nginx:alpine Copia artefatos buildados para Nginx, porta 80

Configuração do Nginx

A imagem final usa nginx:alpine com configuração SPA padrão:

  • Serve arquivos estáticos do build Angular
  • Fallback para index.html em rotas desconhecidas (SPA routing)
  • Porta 80

Variáveis de Ambiente em Runtime

As aplicações Angular usam o padrão env.js para configuração em runtime:

javascript // env.js - injetado pelo Helm chart via ConfigMap (function(window) { window.__env = window.__env || {}; window.__env.apiUrl = 'https://api.hml.noxtec.com.br'; window.__env.tenant = 'global'; })(this);

O env.js é carregado antes do Angular bootstrap e permite mudar configurações sem rebuild da imagem.

Padrão de Multi-Stage Build

Todos os templates seguem o mesmo padrão de 3 estágios para:

  1. Cache de dependências: O primeiro estágio só copia arquivos de manifesto (pom.xml / package.json). Isso garante que o cache do Docker seja invalidado apenas quando as dependências mudam, não quando o código-fonte muda.

  2. Build isolado: O segundo estágio copia o código-fonte e builda. Se apenas o código mudou, o estágio de dependências é reutilizado do cache.

  3. Runtime mínimo: O terceiro estágio parte de uma imagem limpa e copia apenas o artefato final. Resultado: imagem muito menor sem ferramentas de build.

┌─────────────────────────────────────────┐ │ Estágio 1: dependencies │ │ - Maven tools + JDK OU Node + npm │ │ - Dependências resolvidas │ │ ≈ 800MB-1.2GB │ ├─────────────────────────────────────────┤ │ Estágio 2: build │ │ - Source code + build output │ │ ≈ 1GB-1.5GB │ ├─────────────────────────────────────────┤ │ Estágio 3: runtime FINAL │ │ - Apenas JDK slim OU nginx:alpine │ │ - Apenas o JAR ou dist/ │ │ ≈ 150MB-300MB │ └─────────────────────────────────────────┘

Personalizando para Novas Aplicações

Para adicionar uma nova aplicação:

  1. Copie o template apropriado para o repositório da aplicação como Dockerfile
  2. Ajuste o JAVA_VERSION ou NODE_VERSION se necessário
  3. Se a aplicação tiver estrutura diferente (ex: multi-módulo), adapte os paths de cópia
  4. A action detect-language do pipeline lerá o Dockerfile automaticamente para determinar a linguagem e versão