티스토리 뷰

상황

express로 개발한 backend 서버를 도커 이미지로 만들어 컨테이너로 생성해야 하는 상황이다.

관련해서 진행한 내용을 정리해본다.

프로젝트 구조

Working Directory
	|
	dist
	src
	Dockerfile
	package.json
	package-lock.json

빌드 및 실행 환경

typescript로 구성하였으므로 build 과정이 필요했다.

javascript 프로젝트 인 경우는 빌드 과정은 생략하면 된다.

환경

express + typescript + esm

packages.json

"scripts": {
		...
    "build": "npx ts-node build.ts",
    "start": "node -r module-alias/register ./dist --env=production",
    ...
  },

위와 같이 packages.json 에 빌드 및 빌드 파일 실행 스크립트를 작성하였다.

위 스크립트는 컨테이너에서 빌드 파일을 실행할 때 사용할 것이다.

  • 빌드 파일 생성 경로: /dist

빌드된 파일

Dockerfile 작성

이제 Docker Image를 만들기위해 Dockerfile을 작성 해보자.

# 1단계: 빌드 단계
FROM node AS build

WORKDIR /app

COPY ./ ./
RUN npm install
RUN npm run build

# 2단계: 실제 이미지 생성
FROM node:20-alpine

# 앱 디렉터리 생성
WORKDIR /usr/src/app

COPY package*.json ./

# 앱 소스 추가
## 1단계에서 생성된 파일을 복사해준다.
COPY --from=build ./app/dist ./dist

# --production: devDependencies 제외
RUN npm install --production

# --production: devDependencies 제외
CMD npm run start

참조

  • Multi-stage builds
    • 빌드된 파일을 이용하여 컨테이너 구성을 해야 했는데, 이럴 때 유용하게 사용할 수 있는 기능
    • 첫 번째 단계 에서는 build를 한다. 최종 단계에서는 빌드된 파일을 대상 경로에 복사해준다.

빌드 과정이 필요없는 경우 Multi-stage builds를 사용하지 않고 바로 생성하면 된다.

주요 실행구문에 대한 설명은 아래와 같다.

  • COPY --from=build ./app/dist ./dist
    • build 단계에서 생성된 파일을 ./dist 경로로 복사
      • Working Directory를 /usr/src/app 로 설정했으므로 /usr/src/app/dist 경로에 복사됨.
  • RUN npm install --production
    • production 모드로 dependency 패키지를 설치한다. devDependency를 제외한 패키지가 설치된다.
  • CMD npm run start
    • package.json 에 작성된 start 스크립트를 실행한다.

도커 이미지 빌드

Dockerfile이 작성된 경로에서 아래의 명령어를 실행해준다.

# -t: 이미지 이름 설정
# .: 현재 경로에 Dockerfile을 사용하여 빌드
docker build -t my-express-image .

이렇게 하면 이미지 까지 생성이 완료 되었다.

그 다음 단계인 DB와 연결하여 컨테이너를 생성하는 것은 다음 포트스에서 다루겠다.

[Docker] express 서버 + db 구축하기

댓글