오늘은 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 에
추가를 통해, application-dev.properties 설정 밑밥 깔기
-> 이를 통해, docker copose 를 빌드할 때 개발 모드로 하게 된다.
setp3
application-dev.properties 포트 설정
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 참조하기.
'Project > Buy me If you can' 카테고리의 다른 글
Buyme TIL240813 기술적 의사결정 - 주문 상태 및 반품 상태의 세분화와 Enum 사용 (0) | 2024.08.14 |
---|---|
Buyme TIL 240810 .env 파일 세팅하기 (0) | 2024.08.10 |
1-2 ERD (0) | 2024.08.07 |
1-1 데이터 베이스 (0) | 2024.08.07 |
Buy me If you can 프로젝트 개요 (0) | 2024.08.07 |