[docker] docker-compose 실행시 환경변수를 파일로 관리 및 주입해보자

devMini·6일 전
0

Docker

목록 보기
3/3
post-thumbnail

사건의 발단😢

이클립스에서 인텔리제이로 자바 개발 환경을 이전한 후,

이클립스에서 개발할 때는 환경별로 나누어놓은 application.yml 파일에 주요 정보들을 날 것? 그대로 입력해두고 개발 및 배포를 진행하고 있던 것을 인텔리제이를 통해 외부에서 환경변수를 주입할 수 있도록 변경하였고 순조롭게 개발을 진행한 후 배포를 하였는데 도커 컨테이너가
생성된 후 계속 죽는 현상이 발생 발생했습니다...🤒 (도커가 아파요 ㅜㅜ)
또한, 배포된 사이트에서 로그인 시도시 502 BAD GATEWAY 에러가 발생 (137% 백엔드 사망 이슈)

PS : application-*.yml 파일은 .gitIgnore를 통해 외부로 노출하지 않도록 하고있었음

문제 파악

도커 컨테이너가 죽었다? 할 일은 세가지 입니다.
1. docker ps -a를 통해 컨테이너가 죽어있는걸 확인한다.
2. 욕을 한다.
3. docker logs [containerName] 명령어를 통해 컨테이너가 죽은 이유를 파악한다.

위 과정을 통해 log를 확인한 결과 아래와 같은 에러가 발생하고 있었습니다.

Failed to convert from type [java.lang.String] to type [java.lang.Integer] for value '${SERVER_PORT}'

문제 해결

그렇습니다.
문제는 application-prod.yml에 입력해둔 ${SERVER_PORT} 등의 환경변수를 찾지 못해서
컨테이너 생성 후 어플리케이션 기동시 죽어버리는 것이었습니다.

자, 그럼 이제 문제를 해결해볼까요?


컨테이너 안에서 환경변수를 적용하기 위해서는 아래와 같은 방법이 있습니다.

  1. Compose 파일에 직접 입력한 값
  2. 쉘 환경변수로 등록한 값
  3. 환경변수 파일로 입력된 값(.env 등)
  4. Dockerfile을 통해 삽입된 값

또한 위 순서대로 환경변수가 적용되는 우선순위를 가집니다.

환경변수를 적용하는 방법은 위와 같이 다양합니다만,
저는

  1. docker-compose 파일에 대놓고 환경변수 값을 적어놓는 것은 바람직하지 않아보임.
  2. .env 파일로 필요한 환경변수를 깔끔하게 관리하고 싶었음.
  3. 멋져보여서

와 같은 이유로 docker-compose와 .env파일을 통해 환경변수를 주입할 수 있도록 했습니다.


결과

  1. 도커 컴포즈에 환경변수 항목 추가
myapp.docker-compose.yml

services:
  backend:
   container_name: "my_app"
   user: "myserver"
   image: "my_app_prod"
   ports:
     - "8081:8081"

   /* 중요 !!!*/
   environment:
     - SERVER_PORT=${SERVER_PORT]
     .
     ..
     ...
     ....
     - JWT_SECRET=${JWT_SECRET}
   /* 중요 !!!*/                  

위와 같이 docker-compose의 원하는 서비스 항목에 환경변수를 등록합니다.
실제 작성시에는 당연히 본인이 기입한 환경변수를 정확히 입력해줘야 합니다.

정리하면
application-prod.yml에 기재된 값=${.env 파일에 기재된 KEY값}
와 같은 형식인거죠


2. .env 파일 생성 및 작성

SERVER_PORT=8081
JWT_SECRET=VELOG!3345!!$$GG%

등과 같이 작성해줍니다.

  • .env 파일명은 원하는대로 작성하면됩니다.
  • 저는 .env.prod로 지정했습니다.
  • .env 파일은 도커 컴포즈 파일과 같은 디렉토리에 함께 존재하지 않아도 됩니다.

  1. COMPOSE 실행

아래와 같이 이전에 도커 컴포즈를 실행하던 명령어에 --env-file .env[환경변수 파일명] 만 추가하면됩니다.

 docker-compose --env-file .env -f myapp.docker-compose.yml up -d

저는 도커 컴포즈 파일 경로에 환경변수 파일이 함께 존재하고 있지만 그 경로가 다르다면
--env-file /home/myserver/..../.env
와 같이 환경변수 파일이 존재하는 정확한 경로를 기입해줘야합니다.

마치며

인텔리제이로 개발 환경을 이관하면서 생각보다 많은 것을 배우게 되었습니다.
이전에는 docker에 환경변수를 외부에서 주입해야하던 상황이 없었던터라 인텔리제이에서 빌드 후 배포한 후 컨테이너가 계속 죽었을때는 상당히 당황했습니다..ㅋㅋㅋ

우여곡절이 많았지만 많은걸 경험할 수 있어서 뿌듯했네요

profile
Slowly But Steadily

0개의 댓글