❗️문제상황❗️
현재 진행중인 프로젝트는 Dockerfile를 이용해 Docker Image를 만들어 github action으로 자동배포를 진행한다. 그런데.env
파일을 세팅하다 보니 두 가지 문제가 생겼다. 하나는.env
파일은 github에 올라가지 않기 때문에 yml 파일에서 강제로 만들어 배포해야 한다는 것이고, 다른 하나는 Dockerfile에서 각 환경에 따른 분기처리를 위한 세팅을 해야 한다는 것이었다.
Docker를 처음 다루어봐서 해결하느라 3일이나 걸렸지만 서버 기동하는 것까지 성공하니 엄청 뿌듯하다! 마지막에는 Docker를 로컬에서 테스트하는 방법도 작성해 보도록 하겠다😀
(yml 파일은 dev와 prod로 구분되어 있지만 dev를 기준으로 작성하도록 하겠다.)
먼저, 배포 시 필요한 환경변수 파일은 .env.development
와 .env.production
두 가지이다. 각 파일에는 NEXT_PUBLIC_API_URL 이라는 변수와 api 주소가 저장되어 있다. 해당 변수값을 gihub action secrets에 각 환경별로 저장해준다.
Secrets 저장
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}}
.env.development
파일을 생성하여 저장이렇게 하면 .env.development
을 생성하여 NEXT_PUBLIC_API_URL=http://0.00.00.00:8080
처럼 기존 파일과 같은 내용이 저장되고, 코드 내부에서 해당 변수를 사용할 수 있게 된다.
.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 .
docker ps
명령어로 실행 중인 컨테이너 있는지 확인 docker build -t project-name:latest -f .docker/Dockerfile --build-arg BUILD_ENV=dev --build-arg ENVIRONMENT=development .
로 docker 띄우기 docker ps
로 확인