Docker 컨테이너 환경에서 Play Framework+MongoDB 연동하기 (+ 환경 변수 주입)

오형택·2024년 3월 14일
0

Play-Spark

목록 보기
4/8
post-thumbnail

배포 환경을 감안하여 Scala로 작성된 Play 애플리케이션을 컨테이너 상에서 실행하기로 했다.

sbt 1.7.2 + JDK 8 이미지를 사용했고, 작성한 docker compose 파일은 아래와 같다.

version: "3.8"
services:
  play-app:
    image: sbtscala/scala-sbt:openjdk-8u342_1.7.2_2.12.16
    container_name: play-app
    ports:
      - "9000:9000"
    volumes:
      - .:/app
    networks:
      - play-mongo-network
    command: ["sbt", "run"]
    working_dir: /app
    environment:
      - MONGO_HOSTNAME=${MONGO_HOSTNAME}
      - MONGO_PORT=${MONGO_PORT}
      - MONGO_DATABASE=${MONGO_DATABASE}
      - MONGO_USERNAME=${MONGO_USERNAME}
      - MONGO_PASSWORD=${MONGO_PASSWORD}
networks:
    play-mongo-network:
        external: true

compose 파일 실행 전에 docker create network 명령어를 통해 docker network를 생성해주고 이를 통해 MongoDB 컨테이너와 Play 컨테이너를 연동시켜줬다.

깃 레포에 DB 포트번호나 인증 정보 잘못 올렸다가 나중에 지우려고 하면 개고생이니까 애초에 env 파일로 따로 빼두고 .gitignore에 추가해줬다. docker-compose 파일에서는 위와 같이 ${} 안에 환경변수 이름을 넣어주고 .env 파일을 동일 위치에 추가해주면 자동으로 값을 주입받아 사용할 수 있다.

Play framework에서는 conf/application.conf 파일에 아래와 같은 형식으로 key-value 값을 작성하면 애플리케이션 실행 시 자동으로 시스템 환경 변수(이 경우에는 컨테이너 환경 변수)를 불러온다.

CONFIG_VARIABLE_NAME=${?ENV_VARIABLE_NAME}
ex) MONGO_PORT=${?MONGO_PORT}

애플리케이션 코드에는 com.typesafe.config.ConfigFactory class를 통해 가져올 수 있다.

📌 docker-compose 파일에서 환경 변수를 작성할 때 띄어쓰기 금지

원래 코드 쓸 때 (내가) 보기 좋으라고 indent나 띄어쓰기를 습관적으로 넣는 편인데 아래와 같이 environment를 작성했다가 또 기나긴 시간을 헤맸다.

environment:
  - MONGO_HOSTNAME = ${MONGO_HOSTNAME}
  - MONGO_PORT = ${MONGO_PORT}
  - MONGO_DATABASE = ${MONGO_DATABASE}
  - MONGO_USERNAME = ${MONGO_USERNAME}
  - MONGO_PASSWORD = ${MONGO_PASSWORD}

분명히 environment를 작성해줬는데 컨테이너 내에서 환경 변수를 불러오지 못한다면 한번쯤 체크해볼만한 문제인 것 같다.

이와는 별개로 environment 를 잘 작성해줬다면 container 내 bash 창에서 아래와 같이 확인해볼 수 있다.

>> docker exec <container-name> -it /bin/bash     // ex)
>> echo $env_variable_name                        // >> echo $MONGO_PORT
env_value                                         // 27017
profile
개발자 지망생

0개의 댓글