JIB
1. JIB 간단 설명
Jib는 Dockerfile을 사용하지 않거나 Docker를 설치할 필요 없이 컨테이너를 빌드합니다. Maven 또는 Gradle용 Jib 플러그인에서 Jib를 사용하거나 Jib 자바 라이브러리를 사용할 수 있습니다.
Jib는 애플리케이션을 종속 항목, 리소스, 클래스 등 별개의 레이어로 구성하고 Docker 이미지 레이어 캐싱을 활용하여 변경사항만 다시 빌드함으로써 빌드를 빠르게 유지합니다. Jib 레이어 구성과 작은 기본 이미지는 전체 이미지 크기를 작게 유지하여 성능과 휴대성을 향상합니다.
💡 라이선스: Apache License 2.0
2. 각 레지스트리 별 경로
Google Container Registry (GCR)...
jib.to.image = 'gcr.io/my-gcp-project/my-app'
Amazon Elastic Container Registry (ECR)...
jib.to.image = 'aws_account_id.dkr.ecr.region.amazonaws.com/my-app'
jib.to.image = 'my-docker-id/my-app'
Azure Container Registry (ACR)...
jib.to.image = 'my_acr_name.azurecr.io/my-app'
3. build.gradle 예시
💡 Gradle version 5.1 이상
plugins {
id 'java'
id 'com.google.cloud.tools.jib' version '3.4.1'
}
group = 'com.example'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
}
jib {
from {
image = 'openjdk:11-jre-slim' // 베이스 이미지
platforms {
platform {
architecture = 'amd64'
os = 'linux'
}
platform {
architecture = 'arm64'
os = 'linux'
}
}
auth {
username = 'my-username' // 레지스트리 사용자 이름
password = 'my-password' // 레지스트리 암호
}
// 인증을 위한 CredHelper 설정
// gcr: Google Container Registry
// ecr-login: AWS Elastic Container Registry
// *(없음): Docker Hub Registry
// acr: Azure Container Registry
credHelper = 'gcr' // 사용할 수 있는 값: 'gcr', 'ecr-login', 'acr'
}
to {
image = 'my-registry.com/example/my-app:1.0' // 목적지 이미지 이름과 태그
tags = ['latest', 'stable'] // 추가 태그
// 인증을 위한 CredHelper 설정
// gcr: Google Container Registry
// ecr-login: AWS Elastic Container Registry
// *(없음): Docker Hub Registry
// acr: Azure Container Registry
credHelper = 'gcr' // 사용할 수 있는 값: 'gcr', 'ecr-login', 'acr', 없음
// 또는 auth를 사용하여 명시적 인증
auth {
username = 'my-username' // 레지스트리 사용자 이름
password = 'my-password' // 레지스트리 암호
}
}
container {
appRoot = '/myapp' // 애플리케이션의 루트 디렉토리
args = ['--server.port=8081'] // 컨테이너 실행 인자
creationTime = 'USE_CURRENT_TIMESTAMP' // 컨테이너 생성 시간
entrypoint = ['/bin/sh', '-c', 'java -cp /app/resources/:/app/classes/:/app/libs/* com.example.Application'] // 엔트리포인트
environment = [
'SPRING_PROFILES_ACTIVE': 'production',
'ENV_VAR_2': 'value2' ] // 환경 변수
extraClasspath = ['/extra-classpath'] // 추가 클래스패스
expandClasspathDependencies = false // 클래스패스를 확장할지 여부
filesModificationTime = 'EPOCH_PLUS_SECOND' // 파일 수정 시간
format = 'Docker' // 이미지 포맷 (Docker/OCI)
labels = [
'maintainer': 'Your Name',
'version': '1.0'] // 라벨
user = '1000:1000' // 컨테이너 유저 (UID:GID)
volumes = ['/var/logs', '/data'] // 볼륨
workingDirectory = '/app' // 컨테이너 작업 디렉토리
}
extraDirectories {
paths {
path {
from = file('extra-files') // 로컬 디렉토리
into = '/extra' // 컨테이너 내 위치
includes = ['**/*.txt', '**/*.sh'] // 포함할 파일 패턴
excludes = ['**/test/*', '**/secret/*'] // 제외할 파일 패턴
}
path {
from = file('additional-resources') // 또 다른 로컬 디렉토리
into = '/resources' // 컨테이너 내 위치
includes = ['**/*.yml', '**/*.properties'] // 포함할 파일 패턴
excludes = ['**/deprecated/**'] // 제외할 파일 패턴
}
}
}
outputPaths {
tar = file('my-app-image.tar') // 이미지의 TAR 아카이브 출력 위치
digest = file('my-app-digest.txt') // 이미지의 다이제스트 출력 위치
imageJson = file('my-app-image.json') // 이미지 메타데이터 JSON 출력 위치
}
dockerClient {
executable = '/usr/local/bin/docker' // Docker 클라이언트 실행 파일 경로
environment = [
'DOCKER_HOST': 'tcp://localhost:2375', // Docker 호스트 설정
'DOCKER_TLS_VERIFY': '1' // Docker TLS 검증 활성화
]
}
containerizingMode = 'packaged' // 컨테이너라이징 모드, 'packaged'는 JAR/WAR, 'exploded'는 분리된 파일
allowInsecureRegistries = true // 보안되지 않은 레지스트리 허용 여부
configurationName = 'runtimeClasspath' // Gradle 빌드 구성 이름
}
실제 사용 예시
jib {
from {
image = 'amazoncorretto:21.0.2-al2023-headless'
container {
ports = ["8080", "8081", "587"]
creationTime = 'USE_CURRENT_TIMESTAMP'
jvmFlags = ['-Djava.security.egd=file:/dev/./urandom', '-Dfile.encoding=utf-8']
}
extraDirectories {
paths {
path {
from = 'webapp/dist'
into = '/app/resources/static'
}
}
}
platforms {
platform {
architecture = 'amd64'
os = 'linux'
}
platform {
architecture = 'arm64'
os = 'linux'
}
}
}
to {
image = IMAGE_NAME // 새로 입력 필요
tags = [scmVersion.version, 'latest']
// tags = [local]
auth {
username = DOCKERHUB_USERNAME // 새로 입력 필요
password = DOCKERHUB_TOKEN // 새로 변경 필요
}
}
}
4. 이미지 빌드
gradle jib
gradle build 시 jib 실행시키도록 구성하는 방법
tasks.build.dependsOn tasks.jib