Project/Buy me If you can

Buyme TIL240809 Dockerfile/DockerCompose 세팅 (intellij 로 실행한 환경과, docker로 실행한 환경은 다르다)

Albosa2lol 2024. 8. 10. 01:40

오늘은 Docker/DockerCompose 환경 구축을 하였다.

 

에러 1

 => ERROR [app build 3/6] COPY build.gradle.kts settings.gradle.kts /app/                                  0.0s
------
 > [app build 3/6] COPY build.gradle.kts settings.gradle.kts /app/:
------
failed to solve: failed to compute cache key: failed to calculate checksum of ref 327dbb8b-f7ef-45d8-92c0-8c553ef7f0db::1ey6bs0voi1gicus18fdcw4wu: "/settings.gradle.kts": not found

 

처음에 build.gradle 만 단일 사용할 것을 고려하지 않아 build.gradle.kts 또는 settings.gradle.kts 를 찾지 못하는 에러가 발생하였다

 

해결 1

 

프로젝트에서 build.gradle과 settings.gradle 파일만을 사용하고 있기에, kts 를 찾지 않도록 코드를 수정햇다.

 

COPY build.gradle.kts settings.gradle.kts /app/ → COPY build.gradle settings.gradle /app/

 

따라서 생성한 도커 파일은 다음과 같다.

 

# Java 21을 기반으로 하는 이미지 선택
FROM eclipse-temurin:21-jdk-alpine AS build

# 작업 디렉토리 설정
WORKDIR /app

# Gradle 빌드 파일과 설정 파일을 복사
COPY build.gradle settings.gradle /app/

# Gradle 종속성을 먼저 다운로드 (캐시 활용)
RUN ./gradlew dependencies --no-daemon

# 나머지 애플리케이션 파일을 복사
COPY src /app/src

# 애플리케이션을 빌드
RUN ./gradlew bootJar --no-daemon

# 실제 실행 환경을 위한 이미지 설정 (Java Runtime Environment)
FROM eclipse-temurin:21-jre

WORKDIR /app

# 빌드된 애플리케이션 JAR 파일을 복사
COPY --from=build /app/build/libs/*.jar app.jar

# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

 

 

 

 

 

에러 2 포트충돌

 

혼자 했으면 굉장히 해맬 수 있는 부분이지만, 사전에 이러한 트러블이 많이 일어나고 있음을 인지하고 시작하였기에,

해당 문제에 직면 후 비교적 빠르게 해결할 수 있었다.

 

처음에 포트 충돌 에러가 나는 이유

 

intellij로 실행한 환경과, docker로 실행한 환경은 분명 다르기 때문이다. 분리된 네트워크 환경이란 것을 꼭 기억해야한다!

 

고로, 다음과 같이 해결한다.

 

step1

docker-compose.yml 파일에서 db(나의 경우 mysql) 에 연결된 port 를 주석처리, 그리고 그래도 되는 이유

 

#    ports:
#      - "3306:3306"

 

-> 로컬 포트 사용 회피: 로컬 머신에서 이미 포트 3306이 사용 중일 경우(예: 로컬 MySQL 서버가 실행 중인 경우), 포트 충돌이 발생할 수 있다. 주석 처리하여 Docker Compose가 로컬 포트 3306을 노출하지 않도록 하면 이러한 충돌을 방지할 수 있다.

 

step2

 

Dockerfile 에

ENV SPRING_PROFILES_ACTIVE=dev

추가를 통해, application-dev.properties 설정 밑밥 깔기

 

-> 이를 통해, docker copose 를 빌드할 때 개발 모드로 하게 된다.

 

setp3

application-dev.properties 포트 설정

spring.datasource.url=jdbc:mysql://db:3306/buyme

 

url을 다음과 같이 설정한다. 왜? 

 

-> jdbc:mysql://db:3306/buyme에서 db는 Docker Compose에서 정의된 MySQL 서비스의 이름이다.

이 설정으로 인해  Docker Compose 환경에서 제대로 작동할 것이다.

 

즉, localhost 가 아닌 db 로 설정을 해야한다는 것 이다.

 

왜? 인지는 우리의 친절한 docker-compose.yml 파일에 해답이 숨겨져 있다.

docker-compose.yml 파일의 services 중, 내 db(mysql) 와 연결되는 곳의 이름을 db 로 설정하였기 때문이다.

 

자세한 건  https://free-asphalt-782.notion.site/Docker-CICD-666e63fd993744e3b8bb13e8f888f43c 참조하기.