도커 빌드시간 최적화하기

rejs·2026년 1월 3일

도커 하나 빌드하는데 1분씩이나 걸린다.

github action에서는 3분씩이나 걸린다. 문제를 해결해보자

# build
FROM amazoncorretto:21-alpine AS builder
WORKDIR /app

COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .

COPY src ./src

RUN chmod +x ./gradlew

RUN ./gradlew clean bootJar -x test

# run
FROM amazoncorretto:21-alpine
WORKDIR /app
COPY --from=builder /app/build/libs/*.jar app.jar
RUN wget -O agent.jar https://github.com/grafana/grafana-opentelemetry-java/releases/latest/download/grafana-opentelemetry-java.jar
ENTRYPOINT ["java", "-javaagent:agent.jar", "-Dspring.profiles.active=prod", "-jar", "app.jar"]

도커의 빌드캐시

도커는 빌드할 때 이미지 레이어를 쌓는다

그리고 이전의 이미지 레이어와 비교 후 재사용할지 빌드할 지를 결정한다.

상위의 이미지 레이어가 변경되면 하위의 이미지 레이어를 모두 다시 빌드하게 된다.

사실 보통 하위의 데이터들이 상위 데이터에 의존관계를 가지는 것이 당연하므로 자연스러운 작동이라 생각된다. (그러지 않다면 사실 상위에 위치할 이유가 없으므로)

그러므로 도커 빌드를 최적화하는 방법은 자주 바뀌지 않을 데이터를 상위에 올리는 것이다.

# build
FROM amazoncorretto:21-alpine AS builder
WORKDIR /app

COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .

# 없으면 github action에서 문제 생김 
RUN chmod +x gradlew

# 의존성을 먼저 불러온다 
RUN ./gradlew dependencies --no-daemon

# 소스코드를 복사한다 
COPY src ./src

RUN ./gradlew bootJar -x test --no-daemon

# run
FROM amazoncorretto:21-alpine
WORKDIR /app

# 매번 같은 값을 가지는 jar 
RUN wget -O agent.jar https://github.com/grafana/grafana-opentelemetry-java/releases/latest/download/grafana-opentelemetry-java.jar

# 빌드의 결과물 
COPY --from=builder /app/build/libs/*.jar app.jar

ENTRYPOINT ["java", "-javaagent:agent.jar", "-Dspring.profiles.active=prod", "-jar", "app.jar"]

이렇게 자주 변하는 데이터를 뒤로 보내자

0개의 댓글