<aside> 👨💻 최적화 이전 빌드 Dockerfile
</aside>
# Dockerfile
# docker-compose를 실행하면 이 dockerfile이 실행된다.
# 사용할 Java 이미지
FROM eclipse-temurin:21
# ARG는 빌드 시간에 사용할 수 있는 변수를 선언해.
# 여기서는 JAR_FILE 변수를 선언하고, 초기값으로 ./build/libs/jpashop-0.0.1-SNAPSHOT.jar를 설정했어.
# 이는 도커 이미지를 빌드할 때 이 경로의 JAR 파일을 사용하겠다는 거야.
ARG JAR_FILE=./build/libs/string-0.0.1-SNAPSHOT.jar
# COPY 명령어는 호스트 시스템에서 Docker 컨테이너로 파일이나 폴더를 복사할 때 사용해.
# JAR_FILE 변수로 지정된 파일을 Docker 이미지 안의 app.jar라는 이름으로 복사하고 있다.
COPY ${JAR_FILE} app.jar
# ENTRYPOINT는 컨테이너가 시작될 때 실행될 명령어를 설정해. 여기서는 java 명령을 사용해 app.jar 파일을 실행하고 있다.
# 추가적으로, -Djava.security.egd=file:/dev/./urandom 옵션을 통해 더 빠른 엔트로피 생성을 위해 urandom 장치를 사용하도록 설정하고 있어.
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
# 첫 번째 단계: 빌드를 위한 임시 이미지
FROM eclipse-temurin:21 as builder
WORKDIR /app
COPY . /app
RUN ./gradlew build
# 두 번째 단계: 실행을 위한 최종 이미지
FROM eclipse-temurin:21
COPY --from=builder /app/build/libs/*.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
eclipse-temurin:21
을 사용해. as builder
는 이 이미지를 빌드 단계의 별칭으로 설정해 줘./app
으로 설정해./app
디렉터리로 복사해. 이렇게 하면 소스 코드와 빌드 스크립트가 컨테이너 내부로 이동해.eclipse-temurin:21
을 사용해. 이는 앞서 빌드 단계에서 사용한 것과 동일한 이미지야.app.jar
로 복사해. -from=builder
는 파일을 복사할 때 첫 번째 단계의 결과물을 사용하겠다는 것을 의미해.java
명령을 사용해 app.jar
를 실행하도록 설정해. 추가적으로, Djava.security.egd=file:/dev/./urandom
옵션을 통해 더 빠른 엔트로피 생성을 위해 설정하고 있어.이렇게 다단계 빌드를 사용하면 빌드 도구나 중간 생산물을 최종 이미지에서 제거함으로써 이미지 크기를 최소화하고, 보안을 강화할 수 있어. 또한, 관리도 편리해지고, 빌드 및 배포 프로세스가 더욱 효율적으로 진행될 수 있어.