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
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