docker-compose.yml에서 mysql, springboot 컨테이너 빌드 순서 정해주기

일단 해볼게·2023년 3월 30일
0

Docker

목록 보기
2/2

mysql 컨테이너가 먼저 빌드되어야 springboot에서 mysql을 연결할 수 있다.
그러나 springboot가 먼저 빌드되어서 mysql을 연결하지 못하는 이슈가 발생했다.

depends_on

docker-compose.yml에서 depends_on 옵션으로 설정할 수 있다고 생각하지만 depends_on 옵션빌드 시작 순서를 정해주는 것이지 빌드가 끝나는 순서를 정해주는게 아니다.

해결방법

mysql이 빌드되기 전까지 springboot의 빌드를 대기시킨다.

  1. backend/Dockerfile에 코드를 추가 (jdk 17 기준)
FROM gradle:7.6-jdk17 as build

ENV APP_HOME=/apps

WORKDIR $APP_HOME

COPY build.gradle settings.gradle gradlew $APP_HOME

COPY gradle $APP_HOME/gradle

RUN chmod +x gradlew

RUN ./gradlew build || return 0

COPY src $APP_HOME/src

RUN ./gradlew clean build

FROM openjdk:17.0.2-jdk

ENV APP_HOME=/apps
ARG ARTIFACT_NAME=app.jar
ARG JAR_FILE_PATH=build/libs/fm-studio-0.0.1-SNAPSHOT.jar

WORKDIR $APP_HOME

COPY --from=build $APP_HOME/$JAR_FILE_PATH $ARTIFACT_NAME

EXPOSE 8080

ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.9.0/wait /wait
RUN chmod +x /wait
CMD /wait && java -jar app.jar
  1. docker-compose.yml에서 backend 컨테이너에 environment에 WAIT_HOSTS 옵션 추가
backend:
    container_name: backend
    build: ./backend/
    ports:
      - "8080:8080"
    environment:
      WAIT_HOSTS: mysql:3306
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/${MYSQL_DATABASE}?createDatabaseIfNotExist=true&characterEncoding=UTF-8&profileSql=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
      SPRING_DATASOURCE_USERNAME: ${MYSQL_USER}
      SPRING_DATASOURCE_PASSWORD: ${MYSQL_PASSWORD}
      SPRING_JPA_HIBERNATE_DDL_AUTO: update
    depends_on:
      - mysql
    networks:
      - fmstudio

적용한 프로젝트
https://github.com/Techeer-FM-Studio/backend

profile
시도하고 More Do하는 백엔드 개발자입니다.

0개의 댓글