[Docker] Docker Compose로 Container에 환경변수 주입하기
by eelseungmin배경
CI-CD 프로세스를 구축하다가 deploy.sh에 적힌 배포 스크립트에 따라 실행된 컨테이너가 곧바로 종료되는 상황이 발생했다.
배포 스크립트에 문제가 있나 싶었지만, Github Actions 로그 상으로는 별 문제가 없어 보였다.
그렇다면 어플리케이션 자체에 문제가 있나 싶어서 sudo docker logs "컨테이너명"을 통해서 컨테이너의 로그를 까봤다.
로그를 살펴보니 RDS USERNAME 문제로 인해 연결에 실패했다고 한다.
하지만 IDE 상에서도 환경변수를 제대로 설정해 주었고, 심지어 컨테이너가 실행되고 있는 Host OS인 우분투에도 환경변수를 잘 등록해 놨다.
도대체 무엇이 문제일까 한동안 고민했고 곧 답을 찾았다.
위 그림에서 보듯 Host 안에 Container가 실행되긴 하지만 Container 자체가 격리된 공간이므로 당연하게도 Host와 환경변수를 공유하지 않는다. 그렇다면 Host에 환경변수를 등록할 게 아니라 Container 자체에 환경변수를 등록해줘야 한다는 얘기가 된다.
주입하는 방법
원인을 파악하자마자 도커 공식문서를 뒤져봤고 다음 공식문서에서 설정 방법을 찾을 수 있었다.
https://docs.docker.com/build/bake/compose-file/#env-file
즉, 도커 컴포즈 파일이 위치한 경로에 .env 파일을 생성하고 안에 환경변수를 적어주면, 도커 컴포즈 파일 내에서 스프링과 거의 동일한 방식으로 환경변수를 주입 받을 수 있었다.
.env
RDS_USERNAME=USERNAME
RDS_PASSWORD=PASSWORD
docker-compose.yml
version: '3.7'
services:
api:
image: eelseungmin/modu-menu-deploy:latest
container_name: seungmin
environment:
- RDS_USERNAME=${RDS_USERNAME}
- RDS_PASSWORD=${RDS_PASSWORD}
혹은 다음과 같은 방식으로 환경변수가 기록된 파일을 한 번에 등록하는 것도 가능하다.
version: '3.7'
services:
api:
image: eelseungmin/modu-menu-deploy:latest
container_name: seungmin
env_file:
- ./.env
다시 배포 스크립트를 돌려보면?
결과는 성공이다!
'Note > Infra' 카테고리의 다른 글
무중단 배포 (0) | 2024.04.28 |
---|---|
[Nginx] HTTPS 적용하기 (0) | 2024.02.04 |
블로그의 정보
eel.log
eelseungmin