🐋Docker를 통해 배포할 때 환경변수 설정하는 방법
2025. 5. 21. 16:09

이전처럼 intelliJ에 환경변수 설정을 하는 방법만으로는 배포 환경에서 프로그램이 실행되지 않는다.

🚢Docker라는 배에 .env 환경변수를 같이 태워야, IntelliJ없이 도커만으로도 정상적으로 스프링부트가 실행된다.

🐋 Docker에서 환경변수 설정하는 방법

1. 수동 탑재 : docker run -e 명령어 사용

`docker run -e` 명령어를 통해서 환경변수를 세팅하는 방법이 있다.

2. 자동 탑재 : docker-compose 파일을 통해 .env 세팅

docker run -e 명령어를 통한 방법은 터미널창에 환경변수를 입력해주어야 하는 탓에 실수 할 수 있다.

따라서 등장한 다른 자동 세팅 방법.

compose 파일에 `${DB_NAME}` 과 같은 형식으로 위치시킨다

`docker-compose up -d` 명령어를 통해 실행하면 자동으로 해당 컨테이너 안의 환경변수로 전달된다.


우리가 local에 설정한 환경변수 설정은 docker에서는 인식하지 못한다.

local과 docker에서의 환경변수 설정 방식은 다르기 때문에

Docker 싣을 환경변수와 local에서 실행할 환경변수를 분리하여 관리해주어야 한다.

내가 선택한 환경변수 설정 방법은 다음과 같다~~

🚢 로컬과 도커의 환경변수 분리하여 설정하기

1. 설정 파일 분리

  • `application.properties` : 공통 설정
  • `application-local.properties` : 로컬 개발 환경
  • `application-docker.properties` : 도커 실행 환경

2. Docker의 환경설정

  • `application.properties` : 공통 환경 변수 설정
  • `application-docker.properties` : docker에 대한 환경변수 설정
[application-docker.properites]

spring.datasource.url=jdbc:mysql://mysql:3306/${DB_NAME}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
  • `docker-compose` 파일에서 docker의 환경변수를 어떻게 불러올지 설정함
    • 🗣️ `env_file` : .env 파일을 통해 환경변수 주입할게
    • 🗣️`SPRING_PROFILES_ACTIVE=docker` : `application-docker.properties` 파일 읽을게
[docker-compose.yml]

app:
  env_file:
    - .env
  environment:
    - SPRING_PROFILES_ACTIVE=docker
  • root 최상단 위치에 .env 파일 생성
    • `.env` 파일은 docker 환경에만 적용됨 (local 파일에는 import 하지 않았기 때문)
    • `.env`는 꼭 .gitignore에 추가할것
    • REDIS_PORT : 6379 (docker의 포트번호)
[.env]
DB_NAME=디비명
DB_USERNAME=root
DB_PASSWORD=패스워드
REDIS_HOST=redis
REDIS_PORT=6379
JWT_SECRET_KEY=어쩌구

3. Local의 환경설정

  • `application.properties` : 공통 환경 변수 설정
    • 인텔리제이에서 실행 시, 기본값인 `local`로 실행됨
[application.properites]

spring.profiles.active=local
	
... 그밖의 공통 사항들
  • `application-local.properties` : local에 대한 환경변수 설정
[application-local.properites]

spring.datasource.url=jdbc:mysql://localhost:3306/${DB_NAME}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
  • local 환경에 대한 IntelliJ 환경변수 설정
    • intelliJ라는 프로그램에 입력한 값이므로 docker는 읽을 수 없음
    • 해당 값이 local의 환경변수에 주입됨.
    • REDIS_PORT : 26379 (localhost의 포트번호)


⚠️ PORT 번호를 환경변수마다 각각 다르게 적어주는 이유

이건 redis 뿐만 아니라, mysql이나 spring application도 마찬가지임

Docker의 환경변수를 설정하는 `docker-compose` 파일을 확인해보자

  redis:
    image: redis:latest
    container_name: redis
    ports:
      - "26379:6379"
    volumes:
      - redis_data:/data
    networks:
      - backend

위에서 `"26379:6379"`는 `호스트 포트 : 컨테이너 내부 포트` 형식

해당 코드를 통해 localhost와 docker의 포트가 바인딩 되어 연결되는 구조임을 확인할 수 있음

이와 같이 포트를 매핑함으로써 동일한 포트를 사용하는 여러 컨테이너 간의 충돌을 방지할 수 있음😉


🌕회고

환경변수를 설정하는 데에 정답은 없다지만, 그렇기에 어떤 방식을 사용하여 docker와 local의 환경변수를 분리할지 고민을 많이 했다. 다행히 팀프로젝트의 기존 환경변수가 intelliJ를 통해 주입되고 있어서 도커용 환경변수 파일로는 .env 파일을 사용하되, local에는 주입되지 않도록 따로 import문을 적어주지 않는 방식으로 해결했다. 일단 도커에 태우려면 뭐든 docker-compose 파일이나 Dockerfiles를 통하면 된다는 점! 굉장히 깔끔하다.

LIST