
CI/CD 자동화 파이프라인을 구축할 때, 서비스별 환경 변수가 점점 많아지면 이를 Docker Compose에 매번 일일이 작성하는 방식은 너무 번거롭고 비효율적입니다.
이 글에서는 GitHub Actions + Docker Compose를 사용하는 프로젝트에서 .env 파일 하나로 환경 변수를 효율적으로 관리하는 방법과, 그에 따른 CI/CD 설정법을 정리했습니다.
eventor/
├── .env # 공통 환경 변수 파일
├── eventor-front/
├── eventor-back/
├── eventor-auth/
├── eventor-gateway/
└── eventor-eureka/
.env 파일을 참조하도록 구성.env 파일을 활용해 환경 변수 주입environment:
- EUREKA_USERNAME=${EUREKA_USERNAME}
- EUREKA_PASSWORD=${EUREKA_PASSWORD}
- PROD_MYSQL_URL=${PROD_MYSQL_URL}
...
.env로 통합 관리services:
eventor-back-blue-1:
image: dlrudgjs104/eventor-back:blue-1
container_name: "eventor-back-blue-1"
env_file:
- ../.env
environment:
- TZ=Asia/Seoul
- PROD_SERVER_PORT=8101
../.env에 모두 정의environment:로 덮어쓰기.env 관리하기ENV_FILE이라는 이름으로 .env 전체 내용을 저장깃허브 레포지토리 > Settings > Secrets and variables > ActionsEUREKA_USERNAME=your_username
EUREKA_PASSWORD=your_password
MYSQL_USERNAME=your_username
DEV_MYSQL_PASSWORD=your_password
PROD_MYSQL_PASSWORD=your_password
...

jobs:
build:
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Load .env and Install with Maven
run: |
echo "${{ secrets.ENV_FILE }}" > .env
export $(grep -v '^#' .env | xargs)
mvn install
shell: bash
.env 생성export 후 Maven 빌드 시 반영 server:
runs-on: ubuntu-22.04
needs: build
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Write .env file to temporary file
run: echo "${{ secrets.ENV_FILE }}" > .env
- name: Send .env to remote server
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
source: ".env"
target: "/home/eventor"
- name: Deploy to Server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
script: |
cd eventor-back
source deploy.sh
.env 파일을 생성하여 원격 서버로 전송.env는 Docker Compose에서 참조됨 (env_file)| 구분 | 설명 | |
|---|---|---|
env_file 위치 | Docker Compose에서 .env 경로(../.env) 정확히 맞춰야 인식됩니다. | |
| 변수 우선순위 | env_file의 변수보다 environment:가 우선합니다. | |
| 비밀 관리 | .env를 Git에 올리지 말고 반드시 GitHub Secrets로 관리하세요. |
이 구조를 사용하면:
.env 파일 하나로 모든 서비스 환경 변수 관리.env를 안전하게 전달하고 사용할 수 있음