배포 환경을 감안하여 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