.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에 푸시함)
# [Database]
MYSQL_ROOT_PASSWORD=입력해주세요
MYSQL_DATABASE=edutube
MYSQL_PASSWORD=입력해주세요
# [Backend]
SECRET_KEY=여기에_랜덤_시크릿키_입력
개발을 시작할 때 터미널에서 명령어 한 줄만 치면 됩니다.
cp .env.example .env
2. Docker Compose 환경변수 치환 적용
기존 docker-compose.yml에 하드코딩되어 있던 비밀번호를 .env에서 읽어오도록 변수 치환(${VARIABLE}) 기법을 적용합니다. Compose는 실행 시 자동으로 같은 디렉토리에 있는 .env 파일을 읽어옵니다.
docker-compose.yml (수정된 부분)
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 파이프라인 코드도 미리 준비해 드릴까요?
댓글
댓글 쓰기