.env를 만드는게 좋을까? 아니면 도커컴포즈안에 다 넣는게 좋을까? .env는 매번 깃허브 팔떄마다 새로넣어야하고 도커컴포즈는 코드가 깃에 올라가서 불안한데 다른건 없지?

 .env를 만드는게 좋을까? 아니면 도커컴포즈안에 다 넣는게 좋을까? .env는 매번 깃허브 팔떄마다 새로넣어야하고 도커컴포즈는 코드가 깃에 올라가서 불안한데 다른건 없지?


신입 개발자님, 보안과 편의성 사이의 딜레마를 정확히 짚으셨습니다.

결론부터 말씀드리면 docker-compose.yml에 비밀번호를 직접 적는 것은 실무에서 절대 금지(Anti-pattern)입니다. 코드가 Git에 올라가는 순간 봇들이 스캐닝하여 DB를 탈취하거나 랜섬웨어를 심는 데 몇 시간도 걸리지 않습니다.

따라서 기본적으로는 .env를 사용하는 것이 맞습니다. 매번 새로 만들어야 하는 귀찮음을 해결하고, 실무에서 사용하는 세 번째 대안(템플릿화 + 비밀 관리자)을 알려드리겠습니다.

1. 실무 표준: .env.example 템플릿 패턴

.env 파일 자체는 Git에 올리지 않되, 키(Key)값만 적어둔 .env.example 파일을 만들어 Git에 올립니다. 팀원이나 본인이 클론(Clone)을 받았을 때 이 파일을 복사해서 값만 채워 넣으면 되므로 누락과 실수를 방지할 수 있습니다.

.env.example (Git에 푸시함)

Plaintext
# [Database]
MYSQL_ROOT_PASSWORD=입력해주세요
MYSQL_DATABASE=edutube
MYSQL_PASSWORD=입력해주세요

# [Backend]
SECRET_KEY=여기에_랜덤_시크릿키_입력

개발을 시작할 때 터미널에서 명령어 한 줄만 치면 됩니다.

Bash
cp .env.example .env

2. Docker Compose 환경변수 치환 적용

기존 docker-compose.yml에 하드코딩되어 있던 비밀번호를 .env에서 읽어오도록 변수 치환(${VARIABLE}) 기법을 적용합니다. Compose는 실행 시 자동으로 같은 디렉토리에 있는 .env 파일을 읽어옵니다.

docker-compose.yml (수정된 부분)

YAML
services:
  # 1. MySQL Database
  isp_edutube_db:
    image: mysql:8.0
    container_name: isp_edutube_db
    restart: always
    environment:
      # .env 파일의 값을 동적으로 주입받음
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    ports:
      - "14003:3306"
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - edutube_net

  # 2. Main Backend
  isp_edutube_backend:
    # ...생략...
    environment:
      # DB URL도 .env 변수를 조합해서 생성 가능
      - DATABASE_URL=mysql+pymysql://root:${MYSQL_ROOT_PASSWORD}@isp_edutube_db:3306/${MYSQL_DATABASE}

3. 실서버 배포 시의 대안 (Cloud Secrets)

"매번 직접 넣기 귀찮다"는 문제는 로컬 환경이 아닌 실서버(운영) 환경에서 더 크게 다가옵니다. 실무에서는 서버에 접속해서 .env를 손으로 만들지 않고 다음 방법들을 사용합니다.

  • GitHub Secrets & CI/CD: GitHub 레포지토리의 보안 설정(Settings -> Secrets)에 비밀번호를 등록해 둡니다. 코드가 푸시되면 GitHub Actions가 서버로 코드를 배포할 때, 등록된 비밀번호를 꺼내어 서버에 .env 파일을 자동으로 생성해 줍니다.

  • Cloud Secret Manager: AWS Secrets Manager, HashiCorp Vault 등을 사용하여 애플리케이션 시작 시 API를 통해 메모리로 직접 비밀번호를 가져옵니다. (엔터프라이즈급에서 사용)

지금 당장은 보안을 위해 .env.env.example을 분리하는 구조로 로컬 환경을 세팅하는 것이 가장 완벽한 선택입니다.

로컬 개발용 .env 세팅을 넘어, 추후 서버 배포 시 GitHub Actions를 이용해 안전하게 환경 변수를 자동 주입하는 CI/CD 파이프라인 코드도 미리 준비해 드릴까요?

댓글

가장 많이 본 글