티스토리 뷰

이번에 FE 1명, BE 1명(본인) 총 2인으로 프로젝트를 시작했다. FE 분이 직접 백엔드 어플리케이션을 실행 환경을 구축하기엔 어려움이 따를 것 같아 docker compose로 환경 구축하기로 결정했다. (실제로 FE분은 자바를 까는 것을 꺼려했다.)

백엔드 서버는 spring boot application과 mysql을 사용하고 있다. 서버 어플리케이션 컨테이너와 mysql 컨테이너를 정의하였고 실행해본 결과 문제가 없어서 FE분에게 내용을 전달했다. 하지만 문제가 계속 계속 터졌다.

 

처음에 작성한 파일은 아래와 같았다.

  • Dockerfile에서 서버 어플리케이션을 build하여 jar파일로 만든 후 jar 파일을 실행
  • docker compose 파일 내 mysql container와 서버 어플리케이션을 실행할 Dockerfile을 지정한 container 작성
  • 환경 변수 명시

FE 분이 Dockerfile을 빌드하자 이런 오류가 발생했다.

Dockerfile
FROM openjdk:17-alpine

failed to create LLB definition: no match for platform in manifest ~ not found

FE분과 나의 차이점은 OS로 나는 WSL2(window)이고 FE분은 MAC OS이었다. 에러 원인도 OS로 생각되어서 다른 이미지로 바꿨다.


이제는 문제 없을 줄 알았지만 이번에는 서버와 데이터베이스와 연결되지 않았다. 참 신기한 게 본인도 역시 볼륨도 지우고 이미지도 지우고 초기 환경에서 똑같이 실행했지만 FE분만 데이터베이스와 연결되지 않았다.

 

에러 메세지를 잘 읽어보니 이미 로컬 데이터베이스가 돌아가고 있어서 3306 포트가 겹쳤었다. 그렇게 이번엔 환경 변수에 3307 포트를 설정하고 실행하였지만 똑같이 데이터베이스와 연결되지 않았다.

version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    restart: always
    ports:
      - '${APP_PORT:-8080}:8080'
    depends_on:
      - db
  db:
    image: 'mysql:8.0'
    ports:
      - '${DB_PORT:-3306}:3306'
    command: --default-authentication-plugin=mysql_native_password
    env_file:
      - ./src/main/resources/application.properties
    environment:
      MYSQL_ROOT_PASSWORD: '${DB_ROOT_PASSWORD}'
      MYSQL_ROOT_HOST: "%"
      MYSQL_DATABASE: '${DB_DATABASE}'
      MYSQL_USER: '${DB_USERNAME}'
      MYSQL_PASSWORD: '${DB_PASSWORD}'
    volumes:
      - '~:/var/lib/mysql'
    healthcheck:
      test: [ "CMD", "mysqladmin", "ping", "-p${DB_ROOT_PASSWORD}" ]
      retries: 3
      timeout: 5s

그때 docker compose 파일인데, application.properties에서 환경 변수를 설정하기 때문에 3307로 바꿨을 때 본인은 잘 실행되었다.


이게 실행되어야 FE분이 편해지기 때문에 포기할 수도 없고 해서 계속 고민해봤다.
그러던 중 현재 나는 잘 돌아가니까 내가 jar 파일로 패키징 한 이미지를 환경변수만 적용하면 돌아가게 만들면 되지 않을까라는 생각을 했다. 즉 docker hub에 jar 파일을 실행한 이미지를 올린다는 것이었다.

 

docker hub에 push하기 위해서는 docker image를 사용자이름/이미지 이름으로 빌드해야 했다.

docker build -t user/example-app . --no-cache

 

그리고 도커 허브에 올린 후 아래처럼 docker compose 파일을 바꿨다.
기존과 달라진 점은 build할 Dockerfile을 명시하는 것이 아니라 사용할 image를 명시한다.

version: '3.8'

services:
  app:
    image: 'user/example-app'
    environment:
      - spring.profiles.active=
      - DB_DATABASE=
      - DB_USERNAME=
      - DB_PASSWORD=
      - DB_ROOT_PASSWORD=
      - DB_HOST=
      - DB_PORT=
    restart: always
    ports:
      - '${APP_PORT:-8080}:8080'
    depends_on:
      - db
...      

실행해보니 이번엔 이미지 파일이 저장은 되지만 불러오기가 안되는 문제가 있었다. 곰곰히 생각해보니 이미지 파일 저장되는 경로를 docker 환경에 맞춰야하고 volumes를 설정하여 로컬 환경과 동기화할 필요가 있었다. 먼저 application-dev.yml에서 직접 명시한 저장 경로를 환경 변수로 바꾼 후 docker compose 파일을 수정했다.

  app:
    image: 'user/example-app'
    environment:
      - spring.profiles.active=
      - DB_DATABASE=
      - DB_USERNAME=
      - DB_PASSWORD=
      - DB_ROOT_PASSWORD=
      - DB_HOST=
      - DB_PORT=
      - IMAGE_ROOT_LOCATION=/app/images
      - IMAGE_BASE_URL=
    volumes:
      - ~:/app/images
    restart: always
    ports:
      - '${APP_PORT:-8080}:8080'
    depends_on:
      - db
...      

이 파일을 FE분에게 전달했고 정상적으로 실행되는 것을 확인했다.
이제는 docker hub에 image가 push된다면 git pull도 필요 없고 image를 새로 풀 받고 실행만 하면 된다.
shell script로 자동화하여 더욱 간단하게 실행할 수 있게 되었다.

'docker' 카테고리의 다른 글

docker compose와 env 파일을 이용하여 mysql 환경 구축  (1) 2023.06.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함