1. Jib là gì?
Jib là một công cụ mã nguồn mở do Google phát triển để xây dựng và đóng gói các ứng dụng Java thành các container Docker hoặc OCI một cách nhanh chóng và tối ưu. Điểm đặc biệt của Jib là không cần Dockerfile hoặc Docker Daemon để hoạt động. Thay vào đó, Jib tích hợp trực tiếp vào các công cụ build phổ biến như Maven và Gradle.


2. Đặc điểm nổi bật của Jib
- Không cần Docker Daemon: Bạn không cần cài Docker trên máy để sử dụng Jib. Nó có thể build và push hình ảnh container trực tiếp lên các registry (Docker Hub, Google Container Registry, AWS ECR, v.v.).
- Tích hợp sẵn với Maven và Gradle: Jib hoạt động như một plugin của Maven hoặc Gradle, giúp bạn dễ dàng tích hợp vào quy trình build hiện tại của mình.
- Không cần Dockerfile: Jib tự động cấu hình container dựa trên ứng dụng Java của bạn. Bạn không cần viết file Dockerfile thủ công.
- Hiệu năng cao: Jib sử dụng cơ chế build từng lớp (layered builds), giúp giảm thời gian build lại (chỉ cập nhật những phần thay đổi).
- Cấu hình linh hoạt: Dễ dàng cấu hình base image, environment variables, entrypoint, v.v.
3. Lợi ích khi dùng Jib
- Nhanh chóng và tự động: Không cần phải học cách viết Dockerfile.
- Hỗ trợ native Java: Jib được tối ưu cho các ứng dụng Java, đặc biệt là Spring Boot.
- Bảo mật: Không cần quyền root để chạy Docker Daemon.
- Tái sử dụng lớp build: Các dependencies của bạn và mã nguồn được build thành các layer riêng biệt, giúp tối ưu hóa kích thước image và tăng tốc quá trình deploy.
4. Cách hoạt động của Jib
Jib chia ứng dụng Java của bạn thành các lớp (layers):
- Base image: Chọn một image cơ bản (thường là JRE hoặc JDK).
- Dependencies: Các dependency của dự án (từ
pom.xml
hoặcbuild.gradle
). - Resources: Các file cấu hình hoặc tài nguyên (ví dụ:
application.properties
). - Classes: Code đã được biên dịch.
6. Khi nào nên dùng Jib?
- Bạn đang phát triển ứng dụng Java/Spring Boot và muốn nhanh chóng đóng gói thành container.
- Bạn không muốn quản lý thủ công file Dockerfile.
- Bạn muốn tích hợp quy trình đóng gói container vào pipeline CI/CD (Jenkins, GitHub Actions, GitLab CI, v.v.).
7. Đóng gói ứng dụng Spring Boot với Jib
7.1 Tích hợp Jib với Maven pom.xml
... <properties> <java.version>17</java.version> <image.path>registry.hub.docker.com/luongquoctay87</image.path> </properties> ... <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>2.8.0</version> <configuration> <from> <image>openjdk:17-alpine</image> </from> <to> <image>${image.path}/${project.artifactId}:20241213</image> <!-- Setting dockerhub account --> <auth> <!--suppress UnresolvedMavenProperty --> <username>${env.DOCKER_USERNAME}</username> <!--suppress UnresolvedMavenProperty --> <password>${env.DOCKER_PASSWORD}</password> </auth> </to> <container> <ports> <port>8080</port> </ports> <environment> <SPRING_PROFILES_ACTIVE>prod</SPRING_PROFILES_ACTIVE> </environment> </container> </configuration> </plugin> </plugins> <finalName>backend-service</finalName> </build>
- Base image:
openjdk:17-alpine
- Tên image: ${image.path}/${project.artifactId}:20241213
- image.path:
registry.hub.docker.com/luongquoctay87
- project.artifactId:
backend-service
- tag:
20241213
(or latest) - auth: Tài khoản để login
hub.docker.com
.env.DOCKER_USERNAME
vàenv.DOCKER_PASSWORD
được lấy từ biến môi trường.
- image.path:
- Mở port
8080
- Thêm Environment variable
SPRING_PROFILES_ACTIVE=prod
7.2 Build Image với Jib
- Build và đưa image vào Docker daemon (local Docker): Lệnh này sẽ tạo image và lưu vào Docker daemon trên máy của chúng ta.
mvn package jib:dockerBuild
- Build và push image trực tiếp lên container registry: Nếu bạn muốn đẩy image lên một container registry (ví dụ: Docker Hub, Google Container Registry, AWS ECR), sử dụng lệnh sau:
mvn package jib:build