- 프로젝트 전역에
Dockerfile
,.dockerignore
생성
Dockerfile
작성
# 프로젝트 노드 환경 FROM node:18-alpine AS base # 프로젝트 패키지 매니저가 pnpm, 전역에 설치 RUN npm install -g pnpm # First Layer FROM base AS deps RUN apk add --no-cache libc6-compat WORKDIR / # 필요한 모듈 설치 COPY package.json pnpm-lock.yaml ./ RUN pnpm install # Second Layer FROM base AS builder WORKDIR / COPY --from=deps /node_modules ./node_modules COPY . . COPY /environments/.env.stg ./ # 필요한 파일들을 전부 복사했는데 왜 여기서 다시 pnpm install을 해줘야 실행이 되는지..? RUN pnpm install # stg 환경 배포 RUN pnpm build:stg # Third Layer FROM base AS runner WORKDIR / ENV NODE_ENV=production # stg 환경변수 세팅 COPY --from=builder /environments/.env.stg ./ ENV $(cat /environments/.env.stg) # nodejs, nextjs 권한 부여 RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs COPY --from=builder /node_modules ./node_modules COPY / ./ COPY --from=builder /public ./public COPY --from=builder --chown=nextjs:nodejs /.next ./.next USER nextjs EXPOSE 3000 ENV PORT 3000 CMD ["pnpm", "start:stg"]
next.config.ts
standalone
옵션 추가
// 빌드 과정에서 import, require 구문들을 분석하여 필요한 파일들만 standalone에 세팅해줌 module.exports = { output: 'standalone', }
Issue
→
.next
경로에 standalone
파일 생성- standalone
- 빌드 과정에서 해당 폴더를 만든다.
- 코드에서 사용한
import
request
코드들을 분석해서 필요한 것들만 해당 폴더에 넣은 뒤 빌드한다.
→ commonjs 로 되어있는 모듈 처리 방식을
module
로 지정// package.json { "type": "module" }
pnpm
not found→ 전역에
pnpm
설치 해준다.RUN npm install -g pnpm
Tasks
docker build -t <이미지명>
docker run -p 3000:3000 <이미지명>
Result
- 삽질했던 이유는 도커 이미지에 필요한 파일들이 잘 이동하지 않았기 때문이다.
- 모든 파일들을 COPY해서 이미지로 보냈더니 잘 실행이됨.
- 이미지 용량은 2.6GB 가량,
.dockerignore
세팅을 해주니 1.2GB까지 줄일 수 있었다.
댓글