🛠 멀티모듈에서 Docker를 적용하려면?
모듈마다 Dockerfile을 따로 만들고, docker build -t ... . 명령어 수동 실행하고, .jar 위치도 직접 지정하고, ... 수동 작업 + 반복 작업이 매우 많다.
→ Palantir는 이걸 Gradle 태스크로 자동화해줘서 매우 편해진다.
Palantir plugin은 Gradle과 도커를 “자연스럽게 연결”
도커 CLI 명령어 없이 ./gradlew docker만으로 도커 이미지 빌드가 가능하다.
files tasks.bootJar.outputs.files
즉, bootJar → docker가 매끄럽게 이어진다.
name rootProject.name + '-' + project.name + ':' + version
Gradle의 version 값으로 도커 이미지 태그를 자동으로 설정 가능하다.
예: myapp-api-user:1.0.0, myapp-api-user:latest 이런 거 만들기 쉽다.
각 모듈이 같은 Dockerfile을 써도 문제 없이 작동하며 유지보수가 간편하다.
좀 더 자세한 설명은 palantir GitHub(클릭)을 참고

플러그인을 설치하기에 앞서, palantir의 지원 버전을 맞추기 위해 루트 프로젝트에서 gradle 설정을 수정해야 한다.
root 프로젝트 > gradle > gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
distributionUrl의 버전을 8.6으로 낮춘다. (내 경우에는 프로젝트를 처음 생성하면 8.13으로 되어있었음)
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()
}
}

plugins{
id 'com.palantir.docker' version '0.36.0'
}
docker{
}
Docker Image를 생성할 하위 모듈에서 palantir plugin을 추가하고 우측 gradle창을 눌러 확인해보면 docker가 생긴 걸 확인할 수 있다.
FROM openjdk:17-ea-slim-buster
ARG JAR_FILE
COPY ${JAR_FILE} /app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
최상위 프로젝트에 Dockerfile을 추가하고 위의 내용을 작성

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를 이용하여 멀티모듈의 image를 한꺼번에 실행하는 것도 가능하다.