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 ambientePOOL_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.htmlem 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:
-
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. -
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.
-
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:
- Copie o template apropriado para o repositório da aplicação como
Dockerfile - Ajuste o
JAVA_VERSIONouNODE_VERSIONse necessário - Se a aplicação tiver estrutura diferente (ex: multi-módulo), adapte os paths de cópia
- A action
detect-languagedo pipeline lerá o Dockerfile automaticamente para determinar a linguagem e versão