[docker] docker-compose 삽질 기록

Seongho·2024년 2월 1일
0

docker

목록 보기
2/3

문제 상황

환경 : 스프링 부트 + mysql
스프링 부트 앱의 도커 파일을 다음과 같이 작성하였다.

Dockerfile

# BUILD (이미지를 만드는 과정)

# Base Image
FROM openjdk:17-alpine

# 운영 환경 컨테이너
WORKDIR /app

# 프로젝트를 빌드한 파일을 변수에 저장
ARG JAR_FILE=./build/libs/NestNet-WebSite-0.0.1-SNAPSHOT.jar

# 컨테이너 WORKDIR 위치에 jar 파일 복사
COPY ${JAR_FILE} nestnet_server.jar


ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILE}", "-Dspring-datasource-url=${SPRING_DATASOURCE_URL}", "-Dspring.datasource.password=${MYSQL_PW}", "-Dspring.mail.username=${EMAIL_ADDRESS}", "-Dspring.mail.password=${EMAIL_PW}", "-Djwt.secret=${SECRET_KEY}", "-Dmail-secret-string=${MAIL_SECRET_STRING}", "-jar", "nestnet_server.jar"]

참고로 ENTRYPOINT의 저 7개의 환경 변수들은 스프링 프로젝트의 application.yml에 적용되어야 할 환경변수이다.
application.yml 중 일부

그리고 docker-compose.yml 파일을 작성하였다.

docker-compose.yml

version: "3.8"

services:
  db:
    image: mysql:8.0.28
    container_name: db_container
    volumes:
      - ./db_data:/var/lib/mysql    # 리눅스 내부 /var/lib/mysql과 host의 db_data를 연결
    ports:
      - "3307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root 계정 비번 

  app:
    depends_on:
      - db
    image: app:latest
    container_name: app_container
    ports:
      - "8081:8080"
    restart: always
    environment:

      SPRING_PROFILE: dev
      SPRING_DATASOURCE_URL: jdbc:mysql://db:3307/데이터베이스이름?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
      SECRET_KEY: 시크릿 키 문자열
      MYSQL_PW: root 계정 비번 
      EMAIL_ADDRESS: 이메일 주소
      EMAIL_PW: 이메일 비번
      MAIL_SECRET_STRING: 이메일 인증 코드

이제 이렇게 작성하고 docker-compose up을 하였다.
그런데,

이렇게 오류가 나면서 계속 실패하는 것이었다. 설정이 잘못된게 있나 해서 이것저것 바꿔보고, 구글링도 해봤지만, 찾을 수 없었다.
그러다 한가지 가설이 떠올랐다.
"만약, docker-compose.yml의 환경변수가 네트워크 내부에 환경변수를 세팅하는 것일 뿐, Dockerfile에 환경변수를 적용하지 않는다면?"


그래서 Dockerfile과 docker-compose.yml을 수정해보았다.

해결

Dockerfile

# BUILD (이미지를 만드는 과정)

# Base Image
FROM openjdk:17-alpine

# 운영 환경 컨테이너
WORKDIR /app

# 프로젝트를 빌드한 파일을 변수에 저장
ARG JAR_FILE=./build/libs/NestNet-WebSite-0.0.1-SNAPSHOT.jar

# 컨테이너 WORKDIR 위치에 jar 파일 복사
COPY ${JAR_FILE} nestnet_server.jar


# 개발 / 운영 환경에 따른 sprinf profile 설정 환경 변수
ENV SPRING_PROFILE dev


ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILE}", "-jar", "nestnet_server.jar"]

docker-compose.yml

version: "3.8"

services:
  db:
    image: mysql:8.0.28
    container_name: db_container
    volumes:
      - ./db_data:/var/lib/mysql    # 리눅스 내부 /var/lib/mysql과 host의 db_data를 연결
    ports:
      - "3307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root 계정 비번

  app:
    depends_on:
      - db
    image: app:latest
    container_name: app_container
    ports:
      - "8081:8080"
    restart: always
    environment:
    
      spring-datasource-url: jdbc:mysql://db:3307/데이터베이스 이름?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
      secret-key: 시크릿 키
      mysql-pw: 1234
      email-address: 이메일 주소
      email-pw: 이메일 비번
      mail-secret-string: 이메일 인증 코드

이렇게 수정했더니 성공적으로 컨테이너가 띄워졌다!

기존에 하려고 했던 방식은 이런 느낌이라면,

변경하고 난 후는 이런 느낌이다.
docker-compose.yml에서 환경변수를 선언하고 컨테이너들이 공유하는 네트워크에 환경변수를 세팅해놓으면, 컨테이너가 실행되는 시점에 환경변수가 적용된다.

profile
Record What I Learned

0개의 댓글