yml 파일에서 .env 파일 생성하기 & Dockerfile 변수명 분기처리 하기

yricog·2025년 1월 3일
0
post-thumbnail

❗️문제상황❗️
현재 진행중인 프로젝트는 Dockerfile를 이용해 Docker Image를 만들어 github action으로 자동배포를 진행한다. 그런데 .env 파일을 세팅하다 보니 두 가지 문제가 생겼다. 하나는 .env 파일은 github에 올라가지 않기 때문에 yml 파일에서 강제로 만들어 배포해야 한다는 것이고, 다른 하나는 Dockerfile에서 각 환경에 따른 분기처리를 위한 세팅을 해야 한다는 것이었다.

Docker를 처음 다루어봐서 해결하느라 3일이나 걸렸지만 서버 기동하는 것까지 성공하니 엄청 뿌듯하다! 마지막에는 Docker를 로컬에서 테스트하는 방법도 작성해 보도록 하겠다😀

1. yml 파일에서 .env 파일 생성하기

(yml 파일은 dev와 prod로 구분되어 있지만 dev를 기준으로 작성하도록 하겠다.)
먼저, 배포 시 필요한 환경변수 파일은 .env.development.env.production 두 가지이다. 각 파일에는 NEXT_PUBLIC_API_URL 이라는 변수와 api 주소가 저장되어 있다. 해당 변수값을 gihub action secrets에 각 환경별로 저장해준다.

  • Secrets 저장

    • DEV_NEXT_PUBLIC_API_URL
    • PRD_NEXT_PUBLIC_API_URL
  • yml 파일에 명령어 추가

- name: Generate Environment Variables File for Devlopment
	run: |
    	echo "NEXT_PUBLIC_API_URL=$DEV_NEXT_PUBLIC_API_URL" >> .env.development
    env:
    	DEV_NEXT_PUBLIC_API_URL: ${{secrets.DEV_NEXT_PUBLIC_API_URL}}
  • 해석
    • name: 개발을 위한 환경변수 파일 생성
    • run : "NEXT_PUBLIC_API_URL = $DEV_NEXT_PUBLIC_API_URL" 문구를 .env.development 파일을 생성하여 저장
    • env : DEV_NEXT_PUBLIC_API_URL 는 secrets의 DEV_NEXT_PUBLIC_API_URL 값을 가져옴

이렇게 하면 .env.development 을 생성하여 NEXT_PUBLIC_API_URL=http://0.00.00.00:8080 처럼 기존 파일과 같은 내용이 저장되고, 코드 내부에서 해당 변수를 사용할 수 있게 된다.

2. Dockerfile 변수명 분기처리 하기

.env 파일을 생성한 뒤 package.json 파일 또한 다음과 같이 수정하게 되었다.

"scripts": {
    "dev": "env-cmd -f .env.local next dev",
	"build:dev": "env-cmd -f .env.development next build",
	"build:prod": "env-cmd -f .env.production next build",
	"start:dev": "env-cmd -f .env.development next start",
	"start:prod": "env-cmd -f .env.production next start"
}

때문에 Dockerfile 에서는 script 실행 명령어파일 복사하는 부분에서 변수를 사용하여 분기처리 할 수 있도록 수정해 주었다.

# Build 
ARG BUILD_ENV
RUN pnpm run build:${BUILD_ENV}

# Copy environment file
ARG ENVIRONMENT
COPY ../.env.${ENVIRONMENT} /app/.env.${ENVIRONMENT}

# Start Next.js 
EXPOSE 3000
ARG BUILD_ENV
ENV BUILD_ENV=${BUILD_ENV}

CMD ["/bin/sh", "-c", "pnpm run start:${BUILD_ENV}"]

해당 변수는 다음과 같이 yml 파일에서 변수 값을 지정하여 사용하면 된다. (Docker 이미지 빌드 시 적용)

- name: Build Docker image
	run: |
  		docker build \
    		-t project-name:latest \
    		-f .docker/Dockerfile \
    		--build-arg BUILD_ENV=dev \
    		--build-arg ENVIRONMENT=development .

3. Docker 로컬 테스트

  1. 터미널에서 docker ps 명령어로 실행 중인 컨테이너 있는지 확인
  2. 해당 프로젝트 & 브랜치 이동
  3. docker build -t project-name:latest -f .docker/Dockerfile --build-arg BUILD_ENV=dev --build-arg ENVIRONMENT=development . 로 docker 띄우기
  4. 다시 docker ps 로 확인
    Docker Desktop 에서도 확인 가능하다!
profile
의미와 가치를 쫓는 개발자 ✨

0개의 댓글