Spring Boot e Docker juntos fazem o deploy ser uma tarefa simples. Com um Dockerfile bem feito, voce empacota a aplicacao e roda em qualquer ambiente sem surpresas.
O Dockerfile basico para uma aplicacao Spring Boot com Java 21:
FROM eclipse-temurin:21-jdk-alpine AS builder
WORKDIR /app
COPY gradlew gradlew.bat build.gradle.kts settings.gradle.kts ./
COPY gradle gradle
RUN ./gradlew dependencies
COPY src src
RUN ./gradlew bootJar -x test
FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
COPY --from=builder /app/build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
O primeiro stage compila o projeto. O segundo stage copia so o JAR. A imagem final e pequena porque nao tem Gradle nem JDK.
Para construir:
docker build -t minha-api .
docker run -p 8080:8080 minha-api
Para passar properties externas no docker run:
docker run -p 8080:8080 \
-e SPRING_PROFILES_ACTIVE=prod \
-e APP_DB_URL=jdbc:postgresql://host.docker.internal:5432/db \
minha-api
Variaveis de ambiente sobrescrevem as properties do application.properties.
Para usar Docker Compose com banco de dados:
version: '3.8'
services:
app:
build: .
ports:
- "8080:8080"
environment:
SPRING_PROFILES_ACTIVE: prod
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/meubanco
SPRING_DATASOURCE_USERNAME: app
SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD}
depends_on:
db:
condition: service_healthy
db:
image: postgres:16
environment:
POSTGRES_DB: meubanco
POSTGRES_USER: app
POSTGRES_PASSWORD: ${DB_PASSWORD}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d meubanco"]
interval: 5s
timeout: 3s
retries: 5
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
O depends_on com condition: service_healthy garante que o banco esteja pronto antes da aplicacao iniciar.
Para imagens ainda menores, use JRE slim ou distroless:
FROM eclipse-temurin:21-jre-alpine
RUN addgroup -S app && adduser -S app -G app
USER app
COPY --from=builder /app/build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
Executar a aplicacao como usuario nao root e uma boa pratica de seguranca.
Para multiplos profiles de Docker Compose:
# docker-compose.override.yml (ambiente local)
services:
app:
environment:
SPRING_PROFILES_ACTIVE: dev
# docker-compose.prod.yml (producao)
services:
app:
environment:
SPRING_PROFILES_ACTIVE: prod
restart: always
Uso: docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d.
That's all for now.
Thanks for reading!
Top comments (0)