[Docker] palantir을 이용해 멀티모듈 프로젝트에 docker 적용

rekv·2025년 3월 25일

Docker

목록 보기
11/12

🛠 멀티모듈에서 Docker를 적용하려면?
모듈마다 Dockerfile을 따로 만들고, docker build -t ... . 명령어 수동 실행하고, .jar 위치도 직접 지정하고, ... 수동 작업 + 반복 작업이 매우 많다.
→ Palantir는 이걸 Gradle 태스크로 자동화해줘서 매우 편해진다.

🧩 Palantir Docker Plugin의 장점

1. Gradle과 도커의 자연스러운 통합

Palantir plugin은 Gradle과 도커를 “자연스럽게 연결”

도커 CLI 명령어 없이 ./gradlew docker만으로 도커 이미지 빌드가 가능하다.

2. .jar 빌드 아웃풋을 자동으로 사용

files tasks.bootJar.outputs.files
  • .jar 파일을 Gradle 태스크에서 바로 추적해서 도커 컨텍스트로 넘긴다.
  • buildArgs(['JAR_FILE': ...]) 와도 연계한다.

즉, bootJar → docker가 매끄럽게 이어진다.

3. 이미지 태그에 version 자동 반영

name rootProject.name + '-' + project.name + ':' + version

Gradle의 version 값으로 도커 이미지 태그를 자동으로 설정 가능하다.
예: myapp-api-user:1.0.0, myapp-api-user:latest 이런 거 만들기 쉽다.

4. 멀티모듈에서 공통 Dockerfile로 빌드 가능

각 모듈이 같은 Dockerfile을 써도 문제 없이 작동하며 유지보수가 간편하다.

좀 더 자세한 설명은 palantir GitHub(클릭)을 참고

Palantir Plugin 적용하기

루트 프로젝트의 gradle-wrapper

플러그인을 설치하기에 앞서, palantir의 지원 버전을 맞추기 위해 루트 프로젝트에서 gradle 설정을 수정해야 한다.
root 프로젝트 > gradle > gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

distributionUrl의 버전을 8.6으로 낮춘다. (내 경우에는 프로젝트를 처음 생성하면 8.13으로 되어있었음)

루트 프로젝트의 gradle

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.4.2'
    id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

bootJar.enabled = false

repositories {
    mavenCentral()
}
subprojects {
    compileJava {
        sourceCompatibility = 17
        targetCompatibility = 17
    }
    apply plugin: 'java'
    apply plugin: 'java-library'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    repositories {
        mavenCentral()
    }

    dependencies {
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'
    }

    tasks.named('test') {
        useJUnitPlatform()
    }

}

하위 프로젝트의 gradle

plugins{
	id 'com.palantir.docker' version '0.36.0'
}

docker{
}

Docker Image를 생성할 하위 모듈에서 palantir plugin을 추가하고 우측 gradle창을 눌러 확인해보면 docker가 생긴 걸 확인할 수 있다.

Dockerfile

FROM    openjdk:17-ea-slim-buster
ARG     JAR_FILE
COPY    ${JAR_FILE} /app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]

최상위 프로젝트에 Dockerfile을 추가하고 위의 내용을 작성

다시 하위 gradle로 가서

docker{
    println(tasks.bootJar.outputs.files) //jar 파일 경로 출력 (디버깅용)
    name rootProject.name+'-'+project.name+':'+version //도커 이미지 이름 지정
    dockerfile file('../Dockerfile') //사용할 Dockerfile 경로 지정
    files tasks.bootJar.outputs.files //이미지 빌드에 포함할 파일 지정
    //Dockerfile로 전달할 빌드 인자 지정
    buildArgs(['JAR_FILE':tasks.bootJar.outputs.files.singleFile.name])
}

Docker Image를 생성하려는 멀티모듈 프로젝트로 가서 각 gradle마다 위의 구문을 작성, gradle에서 docker를 실행

결과

Dockerfile 하나만으로 위와 같이 Docker Image 2개가 동시에 생성된 걸 볼 수 있다. (시각이 다른 이유는 하나가 완료된 다음에 다음 build 작어블 수행하기 때문)

번외) docker-compose

docker-compose를 이용하여 멀티모듈의 image를 한꺼번에 실행하는 것도 가능하다.

0개의 댓글