AgentSkillsCN

gradle-docker-jib

通过 Google 的 Jib 插件,在无需 Docker 守护进程或 Dockerfile 的情况下,配置并构建优化的 Docker 镜像。 适用于容器化 Spring Boot 微服务、构建多架构镜像,或推送到注册表时使用。可通过“设置 Jib”、“构建 Docker 镜像”、“使用 Jib 容器化”或“多架构镜像”等短语进行触发。适用于 build.gradle.kts,并涵盖 Jib 插件的设置、多模块配置,以及 CI/CD 集成。

SKILL.md
--- frontmatter
name: gradle-docker-jib
description: |
  Configures and builds optimized Docker images using Google's Jib plugin without Docker daemon or Dockerfile.
  Use when containerizing Spring Boot microservices, building multi-architecture images,
  or pushing to registries. Triggers on "setup Jib", "build Docker image", "containerize
  with Jib", or "multi-arch image". Works with build.gradle.kts and includes Jib plugin
  setup, multi-module configuration, and CI/CD integration.

Gradle Docker Jib Integration

Table of Contents

Purpose

Build Docker images efficiently using Google's Jib plugin without requiring Docker installation, Dockerfiles, or container knowledge. Jib automatically optimizes layers and handles multi-architecture builds for local and registry deployments.

When to Use

Use this skill when you need to:

  • Build Docker images without Docker daemon or Dockerfiles
  • Containerize Spring Boot microservices efficiently
  • Create multi-architecture images (amd64, arm64) for cloud deployment
  • Optimize Docker layer caching for faster builds
  • Push images to GCR, Docker Hub, or private registries
  • Integrate Docker image building in CI/CD pipelines

Quick Start

Add Jib plugin to build.gradle.kts:

kotlin
plugins {
    id("com.google.cloud.tools.jib") version "3.4.4"
}

jib {
    from {
        image = "eclipse-temurin:21-jre-alpine"
    }
    to {
        image = "gcr.io/my-project/my-app"
        tags = setOf("latest", project.version.toString())
    }
    container {
        jvmFlags = listOf("-Xmx512m", "-Xms256m")
        ports = listOf("8080")
        user = "nobody"
    }
}

Build to local Docker:

bash
./gradlew jibDockerBuild

Build and push to registry:

bash
./gradlew jib

Instructions

Step 1: Add Jib Plugin

Add to build.gradle.kts:

kotlin
plugins {
    id("com.google.cloud.tools.jib") version "3.4.4"
}

Or in build.gradle:

groovy
plugins {
    id 'com.google.cloud.tools.jib' version '3.4.4'
}

Step 2: Configure Base Image

Choose appropriate base image:

For Spring Boot (JRE only):

kotlin
jib {
    from {
        image = "eclipse-temurin:21-jre-alpine"
        // or for ARM support
        // image = "eclipse-temurin:21-jre"
    }
}

For distroless (minimal):

kotlin
jib {
    from {
        image = "gcr.io/distroless/java21-debian12"
    }
}

See references/detailed-guide.md for base image selection guide.

Step 3: Configure Target Registry

Google Container Registry (GCR):

kotlin
jib {
    to {
        image = "gcr.io/my-project/my-app"
        tags = setOf("latest", project.version.toString())
    }
}

Docker Hub:

kotlin
jib {
    to {
        image = "docker.io/myusername/my-app"
        auth {
            username = System.getenv("DOCKER_USERNAME")
            password = System.getenv("DOCKER_PASSWORD")
        }
    }
}

Private registry:

kotlin
jib {
    to {
        image = "registry.company.com/my-app"
        credHelper = "gcr"  // or "ecr-login", "docker-credential-gcr"
    }
}

Step 4: Configure Container Settings

JVM flags and ports:

kotlin
jib {
    container {
        jvmFlags = listOf(
            "-Xmx512m",
            "-Xms256m",
            "-Dspring.profiles.active=prod",
            "-XX:+UseContainerSupport"
        )
        ports = listOf("8080", "8081")
        labels = mapOf(
            "maintainer" to "team@company.com",
            "version" to project.version.toString()
        )
        user = "nobody"
        workingDirectory = "/app"
    }
}

Environment variables:

kotlin
jib {
    container {
        environment = mapOf(
            "PORT" to "8080",
            "ENV" to "production"
        )
    }
}

See references/detailed-guide.md for advanced container configuration.

Step 5: Configure Multi-Architecture Images

Build for multiple platforms:

kotlin
jib {
    from {
        image = "eclipse-temurin:21-jre"
        platforms {
            platform {
                architecture = "amd64"
                os = "linux"
            }
            platform {
                architecture = "arm64"
                os = "linux"
            }
        }
    }
}

Step 6: Set Up Authentication

Using credential helpers:

bash
# Install credential helper
gcloud auth configure-docker

# Or for Docker Hub
docker login

Using environment variables:

bash
export DOCKER_USERNAME=myuser
export DOCKER_PASSWORD=mypassword
./gradlew jib

In CI/CD:

yaml
# GitHub Actions
- name: Build and Push
  run: ./gradlew jib
  env:
    DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
    DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}

Step 7: Build Images

Build to local Docker daemon:

bash
./gradlew jibDockerBuild
docker images  # Verify image exists

Build and push to registry:

bash
./gradlew jib

Build OCI tar archive:

bash
./gradlew jibBuildTar
# Creates build/jib-image.tar

Step 8: Configure Multi-Module Projects

For multi-module projects, configure Jib in specific modules:

kotlin
// app/build.gradle.kts
plugins {
    id("com.google.cloud.tools.jib")
}

jib {
    to {
        image = "gcr.io/my-project/${project.name}"
    }
    container {
        mainClass = "com.example.app.MainKt"
    }
}

// service-a/build.gradle.kts
plugins {
    id("com.google.cloud.tools.jib")
}

jib {
    to {
        image = "gcr.io/my-project/${project.name}"
    }
}

See references/detailed-guide.md for complete multi-module setup.

Step 9: Optimize Build Performance

Enable caching:

kotlin
jib {
    // Use timestamp for better layer caching
    container {
        creationTime = "USE_CURRENT_TIMESTAMP"
    }
}

Skip unchanged layers: Jib automatically caches layers by content hash - no configuration needed.

Requirements

  • Gradle: 7.0+ (8.11+ recommended)
  • Java: JDK 11+ (21 recommended)
  • Jib Plugin: 3.4.4+
  • Authentication:
    • Docker credential helper (recommended)
    • Environment variables
    • Docker config (~/.docker/config.json)
  • For Local Docker:
    • Docker daemon running
    • jibDockerBuild command
  • For Registry Push:
    • Valid credentials
    • Network access to registry

See Also