문제 상황
git clone
‣ cd (dir)
‣ npm install
‣ npm start
과정을 거치고 있었음cd (dir)
‣ npm install
‣ npm start
의 과정이 한번 추가되어 human error의 발생 빈도 증가docker를 선택한 이유
docker를 기존에 실무에서 사용해본 경험은 없고, 실무와 비슷한 환경을 임의로 구성하여 사용해본 경험이 있었다.
docker를 사용해야겠다고 생각한 이유는
Dockerfile
을 사용하면 입력해야 하는 명령어를 하나로 줄일 수 있으며, docker가 명령어를 순차적으로 수행하기 때문에 human error 발생 확률이 크게 줄어들 것으로 예상docker-compose.yml
을 사용하면 backend 서버까지 명령어 한 줄으로 수행할 수 있음 (backend 서버와 frontend 서버를 순차적으로 실행시켜야 하는데 depends_on
을 사용하면 순서가 보장된다는 점도 좋았음)Dockerfile
에 적혀있는 버전으로 고정되기 때문에 node 버전이 틀릴 위험도 없음실제 사용 과정
🔴 주의! docker를 처음 사용해보는 초보가 작성한 파일과 파일구조입니다. 틀린 부분이나 더 좋은 방법이 있을(많을) 수 있습니다.
파일구조는 프로젝트 안에 node로 작성한 backend
프로젝트와 react를 사용한 frontend
프로젝트가 있다.
각각의 Dockerfile
을 가지고 있으며, 프로젝트의 루트 디렉토리에 docker-compose.yml
이 위치하도록 했다.
작성된 코드는 다음과 같다.
node 버전은 기존에 사용하던 16의 LTS버전 중에 많은 개발자들에게 선호되는 버전을 선택했다.
각 파일을 아래와 같이 작성하고 프로젝트의 루트 디렉토리에서 docker-compose up -d
를 입력하면 프로젝트가 실행된다.
#frontend/Dockerfile
FROM node:16.19.1
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
#backend/Dockerfile
FROM node:16.19.1
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 4000
CMD ["npm", "start"]
#/docker-compose.yml
version: '3'
services:
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
volumes:
- './frontend:/app'
- '/app/node_modules'
ports:
- '3000:3000'
depends_on:
- backend
backend:
build:
context: ./backend
dockerfile: Dockerfile
ports:
- '4000:4000'
volumes:
- './backend:/app'
- '/app/node_modules'
문제점
frontend
디렉토리와 backend
디렉토리에는 각자의 .env
파일이 있는데 기존에는 이 파일들을 cd frontend
‣ vi .env
해서 직접 작성해줬었는데 docker 컨테이너를 실행시키고 나서는 어떻게 작성 해야할 지를 모르겠는 문제가 있었다.
(사실 글을 작성하는 이 시점에서 생각하기로는 docker-compose up -d
전에 각 디렉토리로 이동해서 vi .env
로 작성한 후 하면 되는거였구나 생각이 들긴 하지만)
열심히 찾아본 바로는
1. --env-file
옵션으로 설정 파일을 지정
2. docker-compose.yml
에 env_file
선언하기
두 방식이 있었고, 나는 현장 대응 요원들이 사용해야 하는 명령어이므로 최대한 간결했으면 해서 2번 방식을 사용했다.
해결 과정
docker-compose.yml
파일에
env_file:
- (project_name).env
를 추가해준 후 docker-compose.yml
과 같은 디렉토리에 frontend.env
파일과 backend.env
파일을 생성해줌으로써 해결
결과
docker-compose up -d
만으로 전체 프로젝트를 순차적으로 실행시킬 수 있게 되어 human error가 감소함
마무리
전 회사 책임님이 타사에서 MLops를 하고 계셔서 .env
파일을 어떻게 관리하는지 물어봤는데 gitlab의 CI/CD
툴에 등록해놓고 쓴다고 하셨다.
기회가 된다면 이 방식으로 개선해보고 싶다. 🧚