Amplify to EKS를 위한 Docker 작업기

Amplify to EKS를 위한 Docker 작업기

생성일
2023년 04월 22일
태그
AWS Amplify
AWS EC2
Docker
  1. 프로젝트 전역에 Dockerfile , .dockerignore 생성
  1. 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"]
  1. next.config.ts standalone 옵션 추가
// 빌드 과정에서 import, require 구문들을 분석하여 필요한 파일들만 standalone에 세팅해줌 module.exports = { output: 'standalone', }
 

Issue

notion image
.next 경로에 standalone 파일 생성
  • standalone
    • 빌드 과정에서 해당 폴더를 만든다.
    • 코드에서 사용한 import request 코드들을 분석해서 필요한 것들만 해당 폴더에 넣은 뒤 빌드한다.
 
notion image
→ commonjs 로 되어있는 모듈 처리 방식을 module 로 지정
// package.json { "type": "module" }
 
pnpm not found
→ 전역에 pnpm 설치 해준다.
RUN npm install -g pnpm
 

Tasks

  1. docker build -t <이미지명>
  1. docker run -p 3000:3000 <이미지명>

Result

  • 삽질했던 이유는 도커 이미지에 필요한 파일들이 잘 이동하지 않았기 때문이다.
  • 모든 파일들을 COPY해서 이미지로 보냈더니 잘 실행이됨.
  • 이미지 용량은 2.6GB 가량, .dockerignore 세팅을 해주니 1.2GB까지 줄일 수 있었다.

Reference

댓글

guest