Dockerfile - 도커 이미지 빌드

hazelnut·2022년 9월 2일
0
post-thumbnail

Dockerfile이란

도커 파일은 이미지를 어떻게 만들어야 하는지의 설명서이다. 애플리케이션 구동을 위해 필요한 파일들, 어떤 프레임워크나 라이브러리를 설치해야 하는지(외부 dependency), 필요한 환경 변수 설정, 어떻게 구동하는지의 스크립트를 포함한다. 도커 파일에 작성하는 스크립트 항목에 대해 정리해 보았다.

FROM: 어떤 이미지를 기반으로 이미지를 생성할지 설정
MAINTAINER: 이미지를 생성한 사람의 정보 설정, 보통 이름, 이메일
LABEL: “키:값” 형태로 이미지에 메타데이터 추가. 추가된 메타 데이터는 docker inspect로 확인 가능
RUN: FROM에서 설정한 이미지를 만들기 위해 컨테이너에서 실행할 명령어
CMD: 컨테이너가 시작되었을 때 명령을 실행. 한 번만 가능
EXPOSE: 호스트와 연결할 포트 번호 설정. 생성된 이미지에서 노출할 포트 설정
WORKDIR: 실행 파일이 명령어로 실행될 디렉토리
COPY: 로컬 디렉토리의 파일을 이미지에 복사. 로컬 디렉토리만 가능
ENV: 환경변수 설정
ADD: 파일을 이미지에 추가. 외부 url 및 tar 파일도 추가 가능.
VOLUME: 디렉토리 내용을 컨테이너에 저장하지 않고, 호스트에 저장
USER: 명령을 실행할 사용자 계정 설정

NestJS 프로젝트 빌드

# Step 1
## base Image for Step 1
From node:18 AS builder
## 필요한 모든 것을 처음부터 만드는 것이 아니라 Base Image를 기반으로 시작
## alpine: 최소 단위의 리눅스

WORKDIR /app
## 프로젝트의 모든 파일을 WORKDIR(/app)로 복사
## 컨테이너 안에서 어떤 경로에 실행할 것인지 명시
## app 안에 프로젝트와 관련된 모든 파일을 copy

COPY . .
## 컨테이너로 Copy 할 필요 파일들

## 어플리케이션 build 수행 명령
RUN npm install
RUN npm run build



# Step 2
## base image for Step 2
FROM node:18-alpine

WORKDIR /app

## Step 1의 builder에서 build된 프로젝트를 가져오기
COPY --from=builder /app./

## 애플리케이션이 바인딩 된 포트 번호 Docker daemon에 매핑
EXPOSE 3000

## 런타임 정의하는 CMD로 application 실행하는 명령어 정의
CMD ["npm", "run", "start"] ## 또는 pm2도 사용 가능

도커 파일은 Layer 시스템으로 구성되어 있어서 변경 사항이 빈번한 파일일수록 마지막에 작성한다.

NestJS는 node랑 다르게 Typescript 파일을 Javascript 파일로 build를 먼저 수행하고 어플리케이션을 구동하기 때문에 소스 코드 디렉토리 전체를 복사할 필요가 없고 빌드된 파일만 이미지로 만들면 된다. 따라서 위 과정도 Step 1과 2로 나뉜 것이다.


추가 참고

profile
💡 It is wise to direct your anger towards problems, not people; to focus your energies on answers, not excuses. ⏤ William Arthur Ward

0개의 댓글