← Tất cả bài viết

Dockerfile cho Spring Boot: multi-stage build gọn và nhanh

22/07/2026

Đóng gói ứng dụng Spring Boot thành Docker image tưởng dễ, nhưng làm ẩu ra image nặng vài trăm MB và build lại rất chậm. Multi-stage build giải quyết cả hai.

Vấn đề của Dockerfile ngây thơ

Nếu bạn copy toàn bộ mã nguồn và JDK đầy đủ vào image cuối, image sẽ chứa cả Maven/Gradle, source, JDK — những thứ không cần khi chạy. Kết quả: image phình to và bề mặt tấn công lớn.

Multi-stage build

# Stage 1: build
FROM eclipse-temurin:21-jdk AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline   # cache layer dependency
COPY src ./src
RUN mvn clean package -DskipTests

# Stage 2: runtime — chỉ lấy JAR
FROM eclipse-temurin:21-jre
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

Vì sao nhanh và nhẹ hơn

  • Image cuối chỉ có JRE + JAR, bỏ lại JDK và Maven ở stage build
  • Copy pom.xml và tải dependency trước khi copy source: đổi code không phải tải lại dependency nhờ layer cache
  • Dùng bản JRE (không phải JDK) và cân nhắc image slim/alpine để nhỏ hơn nữa

Mẹo nâng cao: Spring Boot hỗ trợ layered JAR để tách dependency và code thành các layer Docker riêng, tối ưu cache còn tốt hơn.

👉 Dùng thử công cụ liên quan trên dev-hub: YAML Formatter — chạy hoàn toàn trong trình duyệt, không gửi dữ liệu lên server.