docker로 자신이 작성한 코드를 빌드하여 이미지화하고, 이를 컨테이너로 실행하여 로컬에서 배포하는 작업을 진행하였다.
이렇게 하는 이유는 다들 개발 환경이 각각 다를텐데 docker를 이용해 버전이 충돌나지 않고 모두가 동일한 개발환경을 지니기 위해서이다.
docker를 처음 사용하는 입장으로써 굉장히 어려웠고, hot reload는 성공하지도 못했지만 중간 과정을 기록하려 한다.
우선 본인은 docker가 설치되어있고, docker desktop 또한 설치가 되어있다.
Dockerfile을 만들어 준다.
// Dockerfile
# Base image
FROM node:18 AS development
# Create app directory
WORKDIR /usr/src/app
# A wildcard is used to ensure both package.json AND package-lock.json are copied
COPY package*.json ./
# Bundle app source
COPY . .
# Install app dependencies
RUN npm install
# Creates a "dist" folder with the production build
RUN npm run build
# 18-alpine
FROM node:18 AS production
ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}
WORKDIR /usr/src/app
COPY --from=development /usr/src/app ./
EXPOSE 3000
# Start the server using the production build
CMD ["npm", "run", "start:dev"]
도커 이미지 크기를 줄이기 위해서는
FROM node:18 AS production을 FROM node:18-alpine 으로 변경해주면 된다.
그리고 .dockerignore 파일을 생성하고 아래와 같이 작성해준다.
// .dockerignore
Dockerfile
.dockerignore
node_modules
npm-debug.log
dist
일단 여기까지 하면 내 코드를 docker 이미지로 빌드하여 컨테이너로 실행할 수 있다.
// 이미지 생성 docker build -t 이미지이름 // 실행 docker run -p 80:3000 이미지이름
근데 여기서 docker-compose를 이용해 실시간으로 바뀐 코드를 적용시키는 hot reload를 사용하고 싶었다.
그래서 docker-compose.yaml 파일을 만들고 아래와 같이 작성해주었다.
// docker-compose.yaml
version: "3.8"
services:
api:
# image: thomas-oliver/nestjs-dockerized
build:
dockerfile: Dockerfile
context: .
# target: development
# Mount our host Directory to the docker container
# Mount (.) current directory to the docker container thomas/src/app
# reflect file changes from host to container
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
# Run in Debug Mode: npm run start:debug --> Don't forget to start your vscode debugger!
# Run in dev Mode: npm run start:dev
command: npm run start:dev
environment:
# - NODE_ENV: development
# - JWT_SECRET: 1hard_to_guess_secret7890a
# - PORT: 3000
- CHOKIDAR_USEPOLLING=true
ports:
- 3000:3000
# debugging port
- 9229:9229
여기서 운영체제가 윈도우인 경우
environment에 - CHOKIDAR_USEPOLLING=true는 꼭 작성해주어야 한다.
맥은 상관이 없지만 윈도우는 이 코드를 작성해주지 않으면 hot reload가 안된다고 한다.
하지만 난 작성해도 안된다..
반드시 성공시키고 다음 글에 성공 사례를 작성하겠다!