DEV Community

Isaias Velasquez
Isaias Velasquez

Posted on

How to fazer deploy do Spring Boot com Docker sem dor de cabeca

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"]
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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:
Enter fullscreen mode Exit fullscreen mode

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"]
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)