- ๊ฐ์์ ์ฑ์ฅ์ ์ํด ์ต๊ทผ ์ฌ๋ด ๊ฐ๋ฐ์๋ค์๊ฒ ๊ฐ์ ์ฃผ์ ๋ฅผ ์ ํด ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํด๋ณด๊ธฐ๋ก ๊ฒฐ์ ํ์ด์. ์ด๋ฒ ํฌ์คํ ์ ๊ทธ ์ค ์ ๊ฐ ์์ฑํ ๊ธ๋ก docker์ nextjs์ ๋ํด ๋ค๋ค๋ด ๋๋ค.
์ธํฌํฌ์คํ ์ด ๊ทธ๋ฆฌ๊ณ ์ธํฌํฌ๋งํฌ๋ก ์์ํ ABZ๋ ๊ทธ ๊ท๋ชจ๊ฐ ์ฑ์ฅํจ์ ๋ฐ๋ผ ๋ค์ํ ์๋น์ค๋ฅผ ์ถ์ํ๊ฒ ๋์์ต๋๋ค. ์ด ๊ณผ์ ์์ ๋์ด๊ฐ๋ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ์ต๊ทผ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๋์ ํ์ต๋๋ค.
๊ธฐ์กด์ ์๋น์ค๋ค์ ์ฐจ๋ก์ฐจ๋ก migration์ ์งํ ์ค์ด๋ฉฐ, ์ต๊ทผ ์ ๊ท ์ถ์ํ ์ธํฌํฌ๋งค๋์ ๋ฅผ ๋น๋กฏํด ๋ค์ํ ์๋น์ค๋ฅผ ๋ชจ๋ ธ๋ ํฌ ๋ด์์ ๊ฐ๋ฐํ๊ณ ์๋ ์ค์ธ๋ฐ์, ์ด๋ฒ ๊ธ์์๋ ๋ชจ๋ ธ๋ ํฌ ํ๊ฒฝ ๋ด์์ next.js ํ๋ก์ ํธ๋ฅผ ์ ๊ท๋ก ๊ฐ๋ฐํ๋ฉฐ ๋ฐฐ์ด ์ ๊ณผ, docker๋ฅผ ํ์ฉํด ๋ฐฐํฌํ๋ ๊ณผ์ ์ ๋ํด ์๊ฐํฉ๋๋ค.
์ด ๊ธ์ ํตํด ๋ค์ ๋ด์ฉ์ ๋ํด ์ ์ ์์ด์.
- next.js์ standalone ์ต์
- next.js์์ env ํ์ผ์ ์ ์ฉ ๊ณผ์
- standalone ์ต์ ๊ณผ docker๋ฅผ ํ์ฉํด ๊ฒฝ๋ํ๋ next.js ์ด๋ฏธ์ง ๋ง๋ค๊ธฐ
๋ชจ๋ ธ๋ ํฌ์ ๊ตฌ์ถ์ ์์ด turbo๋ฅผ ํ์ฉํ์ต๋๋ค. ๋ชจ๋ ธ๋ ํฌ ํ๊ฒฝ์์ docker๋ฅผ ํ์ฉํ๋ ๊ฒ์ ์ฒ์์ด์๊ธฐ์ ๊ฐ์ฅ ๋จผ์ turbo ๊ณต์๋ฌธ์๋ฅผ ์ฝ์ผ๋ฉฐ docker๋ฅผ ๊ฐ์ด ํ์ฉํ๋ ๋ฐฉ์์ ๋ํด ํ์ต์ ์งํํ๋๋ฐ์, ์ด ๊ณผ์ ์์ ์๋์ ๊ฐ์ ๋ฌธ๊ตฌ๋ฅผ ์ฝ๊ฒ ๋์์ต๋๋ค.
This Dockerfile is written for a Next.js app that is using the standalone output mode.
๋๋์ฒด ์ด๋ค ์ต์ ์ด๊ธฐ์ turbo ๋ฌธ์์์๋ ์ด๋ ๊ฒ ์๊ฐ๋ฅผ ํ๊ณ ์๋ ๊ฑด์ง ๊ถ๊ธํด์ ธ์ ๊ฐ๋จํ๊ฒ ์๋์ ๊ฐ์ด ์ ๋ฆฌํด๋ดค์ต๋๋ค.
๊ณต์ ๋ฌธ์์ ์ค๋ช ์ ๋ฐ๋ฅด๋ฉด, Next.js๋ ๋น๋ ๊ณผ์ ์์ ๊ฐ ํ์ด์ง์ ์์กด์ฑ๋ค์ ํ์ผ๋ฉฐ production ๋ฒ์ ์ ํ์ํ ํ์ผ๋ค์ ๊ฒฐ์ ํฉ๋๋ค. ๋ง์ฝ ์ด ๊ณผ์ ์์ ๋ถํ์ํ ํ์ผ์ด ๋น๋์ ํฌํจ๋๋ค๋ฉด, ๊ฒฐ๊ณผ๋ฌผ์ ์ฉ๋ ๋ํ ์ปค์ง๊ฒ ๋ ๊ฒ์ด๊ณ ์ด๋ก ์ธํด ๋ฐฐํฌ ์๊ฐ, ํธ๋ํฝ ๋น์ฉ ๋ฑ์ ์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ฒ ๋ฉ๋๋ค.
standalone
์ต์
์ ์ด๋ฆ ๊ทธ๋๋ก(๋
๋ฆฝ์ , ๋
๋ฆฝํ) ์ถ๊ฐ์ ์ธ ์ข
์์ฑ ์ค์น ์์ด ๋จ๋
์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋๊ฒ ํฉ๋๋ค. .next/standalone
ํด๋ ๋ด์ ์ต์ํ์ ์ข
์์ฑ๊ณผ ์๋ฒ๋ฅผ ๊ตฌ๋์ํค๊ธฐ ์ํ server.js
ํ์ผ์ด ํฌํจ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด๋ ๊ฒ ๊ตฌ๋๋๋ ์ต์ํ์ ์๋ฒ๋ CDN์ ์ฌ์ฉ์ ๊ถ์ฅํ๋ public
, .next/static
๋๋ ํ ๋ฆฌ๋ฅผ ์ ์ธํ๊ณ production ๋ฐฐํฌ์ ๊ผญ ํ์ํ ํ์ผ๋ค๋ง ํฌํจ์ํต๋๋ค. ๋ฌผ๋ก ํด๋น ๋๋ ํ ๋ฆฌ์ ํ์ผ์ด ํ์ํ๋ค๋ฉด ์๋์ผ๋ก ๋ณต์ฌํ ์ ์์ต๋๋ค.
standalone ์ต์ ์ ๋ํด ์์์ผ๋ ์ด์ ๋ ๊ฐ๋ฒผ์ด docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ์ฐจ๋ก์ ๋๋ค. ์ฝ๊ณ ๋น ๋ฅธ ์ดํด๋ฅผ ์ํด ๋จผ์ docker์ ์ฃผ์ ๊ฐ๋ ์ ๋ํด ๊ฐ๋จํ๊ฒ ์์๋ณผ๊ฒ์.
์ปจํ ์ด๋
์ด๋ฏธ์ง
Dockerfile
๋ณธ๊ฒฉ์ ์ธ Dockerfile ์์ฑ์ ์์ ํ๋ก์ ํธ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด์ ์์ฑ๋ Dockerfile์ ๋ณด์ฌ๋๋ฆฐ ๋ค ๊ฐ ๋จ๊ณ์ ๋ํด ์ฐจ๋ก์ฐจ๋ก ์ค๋ช ํ ๊ฒ์.
# 1. ๋ฒ ์ด์ค ์ด๋ฏธ์ง ์ค์ (node์ Alpine ๊ธฐ๋ฐ)
FROM node:18-alpine AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="${PNPM_HOME}:${PATH}"
# ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น (glibc ํธํ ํฌํจ)
RUN apk update && apk add --no-cache libc6-compat git openssh
# SSH key ์ค์
ARG SSH_PRIVATE_KEY
RUN mkdir ~/.ssh/
RUN echo "${SSH_PRIVATE_KEY}" | tee ~/.ssh/id_rsa
RUN chmod 600 ~/.ssh/id_rsa
# private repository ์ค์น๋ฅผ ์ํ Github Authorization
RUN ssh-keyscan github.com >> ~/.ssh/known_hosts
# 2. ๋น๋ ๋จ๊ณ ์ค์
FROM base AS builder
ARG NODE_ENV
ENV NODE_ENV=$NODE_ENV
ARG STAGE
ENV STAGE=$STAGE
# ์์
๋๋ ํ ๋ฆฌ ์ค์
WORKDIR /app
# ์ ์ฒด ์ฝ๋ ๋ณต์ฌ ํ pruned ์์
COPY . .
# STAGE ๊ฐ์ ๋ฐ๋ผ .env ํ์ผ์ ๋ค๋ฅด๊ฒ ๋ณต์ฌ
RUN if [ "$STAGE" = "development" ]; then \
echo "Using development environment" && \
cp services/ํ๋ก์ ํธ๋ช
/.env.development services/ํ๋ก์ ํธ๋ช
/.env.local; \
elif [ "$STAGE" = "production" ]; then \
echo "Using production environment" && \
cp services/ํ๋ก์ ํธ๋ช
/.env.production services/ํ๋ก์ ํธ๋ช
/.env.local; \
else \
echo "Invalid STAGE value: $STAGE" && exit 1; \
fi
# pnpm๊ณผ turbo ์ค์น
RUN npm install -g pnpm turbo
# ๋ชจ๋
ธ๋ ํฌ์ ๋ฃจํธ package.json๊ณผ lock ํ์ผ ๋ณต์ฌ
COPY package.json pnpm-lock.yaml ./
# ์์กด์ฑ ์ค์น (๋ฃจํธ ์์กด์ฑ ํฌํจ)
RUN pnpm install --frozen-lockfile
# ํ๋ก์ ํธ์ ํ์ํ ์์กด์ฑ๋ง ๋จ๊ธฐ๊ณ prune ์ํ
RUN turbo prune ํ๋ก์ ํธ๋ช
--docker
# 3. ์์กด์ฑ ์ค์น ๋จ๊ณ
FROM base AS installer
ARG NODE_ENV
ENV NODE_ENV=$NODE_ENV
ARG STAGE
ENV STAGE=$STAGE
# ์์
๋๋ ํ ๋ฆฌ ์ค์
WORKDIR /app
# pruned ์์กด์ฑ ๋ณต์ฌ ๋ฐ ์ค์น
COPY --from=builder /app/out/json/ .
RUN npm install -g pnpm turbo
RUN pnpm install --frozen-lockfile
# ํ๋ก์ ํธ ์ ์ฒด ๋ณต์ฌ ๋ฐ ๋น๋
COPY --from=builder /app/out/full/ .
RUN pnpm turbo run build --filter=ํ๋ก์ ํธ๋ช
...
# 4. ์ต์ข
๋ฐํ์ ๋จ๊ณ ์ค์
FROM base AS runner
ARG NODE_ENV
ENV NODE_ENV=$NODE_ENV
ARG STAGE
ENV STAGE=$STAGE
# ์์
๋๋ ํ ๋ฆฌ ์ค์
WORKDIR /app
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
# ํ๋ก์ ํธ ์คํ์ ํ์ํ ํ์ผ๋ค ๋ณต์ฌ
COPY --from=installer --chown=nextjs:nodejs /app/services/ํ๋ก์ ํธ๋ช
/.next/standalone ./
COPY --from=installer --chown=nextjs:nodejs /app/services/ํ๋ก์ ํธ๋ช
/.next/static ./services/ํ๋ก์ ํธ๋ช
/.next/static
COPY --from=installer --chown=nextjs:nodejs /app/services/ํ๋ก์ ํธ๋ช
/public ./services/ํ๋ก์ ํธ๋ช
/public
# ์ ํ๋ฆฌ์ผ์ด์
์คํ
EXPOSE 80
ENV PORT=80
CMD ["node", "services/ํ๋ก์ ํธ๋ช
/server.js"]
1. base ๋จ๊ณ
์ด๋ฏธ์ง ๊ธฐ๋ฐ ์ค์ ๊ณผ SSH ํค๋ฅผ ํตํ ์ ๊ทผ ์ค์
๊ฒฝ๋์ ๋ฐฐํฌ๋ฅผ ์ํด Alpine์ ํ์ฉํด ์ด๋ฏธ์ง ๊ธฐ๋ฐ ์ค์ ์ ์งํํฉ๋๋ค. ํ๋ก์ ํธ์์ ํ์ฉํ๋ ๋์์ธ ์์คํ ์ ์ค์น๋ฅผ ์ํด SSH ํค๋ฅผ ํ์ฉํด ์ ๊ทผ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
2. builder ๋จ๊ณ
ํ๊ฒฝ ๋ณ์์ ๋ง์ถฐ ์ค์ ํ์ผ์ ๋ณต์ฌํ๊ณ turbo prune์ผ๋ก ์ต์ ํ
ํด๋น ๋จ๊ณ์์๋ STAGE ๋ณ์๋ฅผ ํ์ฉํด ์คํํ๊ณ ์ ํ๋ ํ๊ฒฝ์ ์ ํฉ๋๋ค.
next.js์์๋ .env.$(NODE_ENV).local
> .env.local
> .env.${NODE_ENV}
์์๋ก env ๋ณ์๋ค์ด ์ ์ฉ๋๊ธฐ ๋๋ฌธ์, ์ํ๋ env ํ์ผ์ env.local
ํ์ผ๋ก ๋ณต์ฌํฉ๋๋ค (์ถ์ฒ : Next.js ๊ณต์๋ฌธ์)
turbo prune ํ๋ก์ ํธ๋ช
๋ช
๋ น์ด๋ ํด๋น ํ๋ก์ ํธ์ ๊ผญ ํ์ํ ์์กด์ฑ๋ง ๋จ๊ธฐ๊ณ ๋ถํ์ํ ๋ถ๋ถ์ ์ ๊ฑฐํ์ฌ ์ต์ ํํฉ๋๋ค. (์ถ์ฒ : turbo ๊ณต์๋ฌธ์)
3. installer ๋จ๊ณ
์ต์ ํ๋ ์์กด์ฑ ์ค์น ๋ฐ ํ๋ก์ ํธ ๋น๋
ํด๋น ๋จ๊ณ์์๋ builder ๋จ๊ณ์์ ์ต์ ํ๋ ์์กด์ฑ ํ์ผ์ ๋ณต์ฌํ๊ณ ์ค์นํ๋ ์์ ์ ์งํํฉ๋๋ค.
4. runner ๋จ๊ณ
์ต์ํ์ ํ์ผ๋ง ๋ณต์ฌํด ์ ํ๋ฆฌ์ผ์ด์ ์คํ
๋ง์ง๋ง์ผ๋ก ์ต์ข
์คํ ํ๊ฒฝ์ ์ค์ ํ๋ฉฐ, ์ต์ ํ๋ ํ์ผ์ ๋ณต์ฌํฉ๋๋ค.
์์์ ์ค๋ช
ํ๋ฏ standalone ์ต์
์ .next/static/
, public
๋๋ ํ ๋ฆฌ๋ฅผ ํฌํจ์ํค์ง ์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ๋ณต์ฌํ๋ ์์
์ ์งํํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก 80๋ฒ ํฌํธ๋ฅผ ์ด์ด ํธ๋ํฝ์ ๋ฐ์ ์ ์๊ฒ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด standalone ์ต์ ์ ์ ์ฉํด ๋น๋๋ next.js ์ด๋ฏธ์ง์ ์ฉ๋์, ์ต์ ์ ์ ์ฉํ์ง ์์์ ๋์ ์ผ๋ง๋ ์ฐจ์ด๊ฐ ์๋์ง ํ์ธํด๋ณผ๊น์?
์ด๋ ๊ฒ ๋ง๋ค์ด์ง ์ด๋ฏธ์ง๋ฅผ ํ์ฉํด ๋ ๋น ๋ฅด๊ณ ๊ฐ๋ฒผ์ด next.js ํ๋ก์ ํธ๋ฅผ ๋ฐฐํฌํ ์ ์์ต๋๋ค.
์ฒ์ ์ ํด๋ณด๋ ์ต์ ์ด๋ผ ์์ํ์ง๋ง ์ง์ docker๋ฅผ ํ์ฉํ๋ฉฐ ๋น๊ตํ๋ค ๋ณด๋ ๊ทธ ๋ด์ฉ์ ๋ ์ ์ดํดํ ์ ์์๋ ๊ฒ ๊ฐ์์. ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ก์ UI, ์ปดํฌ๋ํธ ๊ฐ๋ฐ๋ง ํ๋ ๋ฐ์ ๊ทธ์น์ง ์๊ณ ์๋น์ค ์ ์ฒด์ ๊ฑธ์ณ ํ์ตํ๋ฉฐ ํ ๊ฑธ์ ๋ ์ฑ์ฅํ ์ ์์์ต๋๋ค. ํ์ฌ next.js๋ก ๊ฐ๋ฐ๋์ด ์๋ ๋ค๋ฅธ ํ๋ก์ ํธ๋ค์ ๊ฒฝ์ฐ์๋ ์๊ฐ์ด ๋๋ฉด standalone ์ต์ ์ ์ฐจ์ฐจ ๊ฒํ ํ ์ ์ฉํด๋ณผ ์์ ์ ๋๋ค.
ABZ์๋ ์ ํด์ง ์ ๋ฌด๋ง ํ๋ ๊ฒ์ด ์๋, ๋์์์ด ๊ณ ๋ฏผํ๊ณ ์ฐ๋ฆฌ์ ํ์ ํ์ฉํด์๋น์๋ฅผ ๋ง์กฑ์ํค๊ณ ์ ๋ ธ๋ ฅํ๋ ์์ง๋์ด๋ค์ด ๊ฐ๋ํฉ๋๋ค. ๋๊ตฌ๋ณด๋ค ๋น ๋ฅด๊ฒ ์ฑ์ฅํ ์ ์๋ ABZ์ ๋ํด ๊ด์ฌ์ด ์์ผ์๋ค๋ฉด ์ฌ๊ธฐ๋ฅผ ๋๋ฌ์ฃผ์ธ์.
FE engineer ๊นํ์ฌ