2024-04-06.md

๐Ÿก

DIL: ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ ๋‹ค์ด๋ธŒ, 5์ฃผ์ฐจ-6

์Šคํ„ฐ๋””: ์›”๊ฐ„ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์˜ค๋Š˜ ์ง„ํ–‰: ๊ฐœ์ธ๊ณต๋ถ€


DIL-week5-6_2024-04-06

| DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | -------- | ---- | -------------------------------------------------- | ----------- | | 5์ฃผ์ฐจ | 9์žฅ | ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ ๋„๊ตฌ๋กœ ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ ํ™˜๊ฒฝ ๊ตฌ์ถ•ํ•˜๊ธฐ | 617~654p |

์˜ค๋Š˜ ์ฝ์€ ๋‚ด์šฉ์„ markdown์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ฉ”๋ชจ

๋„์ปค๋ผ์ด์ฆˆ

  • ์™œ ๋„์ปค?
    • ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์„œ๋น„์Šคํ•˜๊ธฐ ์œ„ํ•œ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„œ๋น„์Šคํ•˜๋ ค๋ฉด? ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ํ•„์š”ํ•˜๋‹ค ex) NGINX
    • ์œ ์—ฐํ•˜์ง€ ๋ชปํ•œ ๋น„์šฉ ์ฒด๊ณ„
  • ์ง์ ‘ ์žฅ๋น„๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์ปจํ…Œ์ด๋„ˆ๋กœ ๋งŒ๋“ค์–ด์„œ ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌํ•˜๋Š” ์ถ”์„ธ โ‡’ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ๋„์ปค
    • ์ข…์†์ ์ด์ง€ ์•Š์€ ์œ ์—ฐํ•œ ๊ด€๋ฆฌ
  • GCP, Google Cloud Platform

๋ฆฌ์•กํŠธ ์•ฑ ๋„์ปค๋ผ์ด์ฆˆ

  • ๋„์ปค๋ž€?

    https://www.docker.com/ Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.

    • ์ปจํ…Œ์ด๋„ˆ ๋‹จ์œ„ ํŒจํ‚ค์ง•
    • ๋ฆฌ์†Œ์Šค ํ™•๋ณด, ์šด์˜์ฒด์ œ ์„ค์น˜, Node.js ์„ค์น˜, ๋นŒ๋“œ etc
  • ์šฉ์–ด

| ์šฉ์–ด | ๋‚ด์šฉ | ๋ฐฉ๋ฒ• | | ---------- | --------------------------------------- | ------------------------------------------------------------------------------------------ | | image | ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ…œํ”Œ๋ฆฟ | Dockerfile์„ ๋นŒ๋“œํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ฆ | | container | ๋„์ปค์˜ ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•œ ์ƒํƒœ | image๊ฐ€ ๋ชฉํ‘œํ•˜๋Š” OS, FS, ๊ฐ์ข… ์ž์›, ๋„คํŠธ์›Œํฌ๊ฐ€ ํ• ๋‹น๋˜์–ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๋…๋ฆฝ๋œ ๊ณต๊ฐ„ | | Dockerfile | ์–ด๋–ค image ํŒŒ์ผ์„ ๋งŒ๋“ค์ง€ ์ •์˜ํ•˜๋Š” ํŒŒ์ผ | dockerize(๋„์ปค ์ด๋ฏธ์ง€ํ™”)์—์„œ ๊ฐ€์žฅ ๋จผ์ € ํ•˜๋Š” ๊ฒƒ์ด Dockerfile ๋งŒ๋“ค๊ธฐ | | tag | image๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ ˆ์ด๋ธ” ๊ฐ’ | โ€œ์ด๋ฆ„:ํƒœ๊ทธ๋ช…โ€ ex) ubuntu:latest | | repository | image๋ฅผ ๋ชจ์•„๋‘๋Š” ์ €์žฅ์†Œ | ๋‹ค์–‘ํ•œ ํƒœ๊ทธ๋กœ ์ง€์ •๋œ ์ด๋ฏธ์ง€๊ฐ€ ๋ชจ์—ฌ์žˆ๋Š” ์ €์žฅ์†Œ | | registry | repository์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์„œ๋น„์Šค | registry์—๋Š” ๋‹ค์–‘ํ•œ repository๊ฐ€ ์žˆ์Œ. ์ž์‹ ์ด ์›ํ•˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›์•„ ์‚ฌ์šฉ ex) Docker Hub |

  • comman line interface
    • https://docs.docker.com/reference/cli/docker/

| ๋ช…๋ น์–ด | ๋‚ด์šฉ | ์˜ˆ์‹œ | ์˜ˆ์‹œ ๋™์ž‘ | docs | | ---------------- | ---------------------------------------------------- | ------------------------------------------------------- | --------------------------------------------------------------------------- | ----------------------------------------------------------- | | docker bulid | Dockerfile์„ ๊ธฐ์ค€์œผ๋กœ image๋ฅผ ๋นŒ๋“œ | docker build -t foo:bar ./ | ./์— ์žˆ๋Š” Dockerfile ๊ธฐ์ค€์œผ๋กœ image๋ฅผ ๋นŒ๋“œํ•˜๊ณ , foo:bar๋ผ๋Š” ํƒœ๊ทธ๋ฅผ ๋ถ™์ธ๋‹ค | https://docs.docker.com/reference/cli/docker/image/build/ | | docker push | image๋‚˜ repository๋ฅผ ๋„์ปค registry์— ์—…๋กœ๋“œํ•˜๋Š” ๊ณผ์ • | docker push dusunax/foo:bar | dusunax ์‚ฌ์šฉ์ž ๊ณ„์ •์— foo:bar ์ด๋ฏธ์ง€๋ฅผ pushํ•œ๋‹ค | https://docs.docker.com/reference/cli/docker/image/push/ | | docker image tag | image์— tag๋ฅผ ์ƒ์„ฑ | docker image tag ์›๋ณธ์ด๋ฏธ์ง€:ํƒœ๊ทธ ๋ณ€๊ฒฝํ• ์ด๋ฏธ์ง€:ํƒœ๊ทธ | ๊ธฐ์กด image์— ์ƒˆ๋กœ์šด tag๋ฅผ ๋ถ™์ธ๋‹ค. ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ํƒœ๊ทธ | https://docs.docker.com/reference/cli/docker/image/tag/ | | docker inspect | image๋‚˜ container์˜ ์„ธ๋ถ€ ์ •๋ณด ์ถœ๋ ฅ | docker inspect {์ด๋ฏธ์ง€๋ช…์ปจํ…Œ์ด๋„ˆ๋ช…} | ์„ธ๋ถ€์ •๋ณด๋ฅผ ์›ํ•˜๋Š” ์ด๋ฏธ์ง€๋ช… ์ปจํ…Œ์ด๋„ˆ | https://docs.docker.com/reference/cli/docker/inspect/ | | docker run | image๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด container ์ƒ์„ฑ | docker container run [OPTIONS] IMAGE [COMMAND] [ARG...] | | https://docs.docker.com/reference/cli/docker/container/run/ | | docker ps | ๊ฐ€๋™ ์ค‘์ธ container ๋ชฉ๋ก ํ™•์ธ | docker stack ps [OPTIONS] STACK | | https://docs.docker.com/reference/cli/docker/container/ls/ | | docker rm | ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ | docker container rm [OPTIONS] CONTAINER [CONTAINER...] | ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด stop ํ›„ ์‚ญ์ œํ•ด์•ผํ•จ | https://docs.docker.com/reference/cli/docker/container/rm/ |

Dockerfile

  • ๋„์ปคํŒŒ์ผ ์•Œ์•„๋ณด๊ธฐ
// Dockerfile
FROM node:18-alpine as build
# FROM ์–ด๋–ค ๋ฒ ์ด์Šค image์—์„œ ์‹คํ–‰๋  ๊ฒƒ์ธ๊ฐ€
# - base image: ์ด ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ด๋ฏธ์ง€, docker๋Š” image์œ„์— image๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
# - node:18-alpine: Node.js 18๋ฒ„์ „์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š” ์ด๋ฏธ์ง€๊ฐ€ alpine ์šด์˜์ฒด์ œ ์œ„์—์„œ ์‹คํ–‰๋œ๋‹ค.

# ์•ŒํŒŒ์ธ ๋ฆฌ๋ˆ…์Šค
# - ๋ฆฌ๋ˆ…์Šค๋ณด๋‹ค ๊ฐ€๋ณ๊ณ  ๋น ๋ฆ„
# (ํ•˜๋‹จ ํ‘œ ์ฐธ๊ณ )

WORKDIR /app # ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ

COPY package.json ./package.json
COPY package-lock.json ./package-lock.json
# ๋ณต์‚ฌํ•˜๋Š” ์œ„์น˜๋Š” WORKDIR, ./app

RUN npm ci
# ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ช…๋ น์–ด ์‹คํ–‰

COPY . ./
# ๋นŒ๋“œ๋ฅผ ์œ„ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ COPY like src, node_modules

RUN npm run build # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ

alpine linux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

| ์ด์œ  | ์„ค๋ช… | | --------------- | -------------------------------------------------------------------------------------------------------------------------------- | | ์ตœ์†Œํ•œ์˜ ํŒจํ‚ค์ง€ | ์•ŒํŒŒ์ธ ๋ฆฌ๋ˆ…์Šค๋Š” ์ตœ์†Œํ•œ์˜ ํŒจํ‚ค์ง€๋งŒ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด ์‹œ์Šคํ…œ ์ž์›์„ ์ ๊ฒŒ ์‚ฌ์šฉํ•จ. ์ด๋กœ์จ ๋ถ€ํŒ… ์‹œ๊ฐ„์ด ์งง๊ณ  ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์ด ์ ์–ด์ง | | ์„ ํƒ์  ์„ค์น˜ | ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋งŒ ์„ค์น˜ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ๋ฐฐ์ œํ•˜๊ณ  ์‹œ์Šคํ…œ์„ ๊ฐ€๋ณ๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ | | ๋„์ปค์— ์ตœ์ ํ™” | ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์–ด ๋„์ปค ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ , ๋ถ€ํŒ… ์‹œ๊ฐ„์ด ๋น ๋ฆ„. ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ | | musl libc | ์•ŒํŒŒ์ธ ๋ฆฌ๋ˆ…์Šค๋Š” glibc ๋Œ€์‹  musl libc๋ฅผ ์‚ฌ์šฉ. musl libc๋Š” ๊ฐ€๋ณ๊ณ  ์ตœ์ ํ™”๋˜์–ด ์žˆ์–ด์„œ ์ผ๋ฐ˜์ ์ธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ด |

glibc์™€ musl libc๋Š”? ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

| ํŠน์ง• | glibc (GNU C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ) | musl libc | | --------- | -------------------------------------------- | ---------------------------------------------------- | | ํฌ๊ธฐ | ํฌ๊ณ  ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•จ | ์ž‘๊ณ  ์ตœ์ ํ™”๋˜์–ด ์žˆ์Œ | | ํฌ๊ด„์„ฑ | ๊ธฐ๋Šฅ์ด ๋งค์šฐ ํ’๋ถ€ํ•˜๊ณ  ํฌ๊ด„์ ์ž„ | ๋‹จ์ˆœํ•˜๋ฉด์„œ๋„ ํ‘œ์ค€์„ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•จ | | ์‚ฌ์šฉ ์‚ฌ๋ก€ | ์ผ๋ฐ˜์ ์ธ ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ ๋ฐ ์„œ๋ฒ„ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•จ | ๊ฒฝ๋Ÿ‰ํ™”๋œ ์‹œ์Šคํ…œ, ์ž„๋ฒ ๋””๋“œ ์žฅ์น˜, ์ปจํ…Œ์ด๋„ˆ ๋“ฑ์— ์ ํ•ฉํ•จ |

์ด๋ฏธ์ง€ ๋นŒ๋“œํ•ด๋ณด๊ธฐ

  • Node.js๋งŒ ์‹คํ–‰๋˜๋Š” ์ด์œ  โ‡’ FROM node:18-alpine์˜ CMD [ "node" ]

๋„์ปค์—์„œ dangling ์ด๋ฏธ์ง€๋Š”?

  • Docker dangling images๋Š” Docker์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. "Dangling"์€ Docker ์ด๋ฏธ์ง€์˜ ์ƒํƒœ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์šฉ์–ด๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • Docker ์ด๋ฏธ์ง€๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ ˆ์ด์–ด์˜ ์ง‘ํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์บ์‹œ๋œ ์ด๋ฏธ์ง€, ์‚ญ์ œ๋œ ์ด๋ฏธ์ง€ ๋“ฑ ๋‹ค์–‘ํ•œ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Dangling ์ด๋ฏธ์ง€๋Š” ๋‹ค๋ฅธ ์ด๋ฏธ์ง€์˜ ๋ถ€๋ชจ๊ฐ€ ์—†๋Š” ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ์ด๋ฏธ์ง€์—์„œ ํŒŒ์ƒ๋˜์ง€ ์•Š๊ณ  ๋‚จ๊ฒจ์ง„ ์ด๋ฏธ์ง€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ dangling ์ด๋ฏธ์ง€๋“ค์€ ๋ณดํ†ต Docker ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋‚˜ ์ด๋ฏธ์ง€ ์—…๋ฐ์ดํŠธ ์ž‘์—… ๋“ฑ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Dockerfile์„ ์ˆ˜์ •ํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ์žฌ๋นŒ๋“œํ•˜๋ฉด ์ด์ „ ์ด๋ฏธ์ง€์˜ dangling ๋ฒ„์ „์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ dangling ์ด๋ฏธ์ง€๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‹œ์Šคํ…œ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์ •๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋””์Šคํฌ ๊ณต๊ฐ„์„ ๋‚ญ๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ •๊ธฐ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ dangling ์ด๋ฏธ์ง€๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. docker image prune ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ dangling ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

nginx ์ด๋ฏธ์ง€

FROM nginx:1.23.2-alpine as start
# ๋นŒ๋“œ๋œ ์ •์  ํŒŒ์ผ์„ ์„œ๋น„์Šคํ•˜๊ธฐ ์œ„ํ•œ ์•ŒํŒŒ์ธ ๋ฆฌ๋ˆ…์Šค ์„ค์น˜

COPY ./nginx/nginx.conf /etc/nginx/nginx.conf # ๋นŒ๋“œํ•œ ํŒŒ์ผ์„ ์„œ๋น„์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก nginx ์„ค์ •ํŒŒ์ผ ๋ณต์‚ฌ
COPY --from=build /app/build /usr/share/nginx/html
# --from=build๋Š” ์•ž์„œ as build๋กœ ์„ ์–ธํ•œ ๋‹จ๊ณ„์—์„œ ๋ณต์‚ฌํ•ด ์˜จ๋‹ค๋Š” ๋œป

EXPOSE 3000
# ์—ด์–ด์ค€ ํฌํŠธ๋Š” ๋„์ปค image๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, ํ˜ธ์ŠคํŠธ ์šด์˜์ฒด์ œ์—์„œ ์˜คํ”ˆ๋œ๋‹ค.
# - ๋„์ปค๊ฐ€ ์ฝ๋Š” ์ •๋ณด๋Š” ์•„๋‹ˆ๊ณ , ์–ด๋–ค ํฌํŠธ๊ฐ€ ์—ด๋ ค ์žˆ๋Š”์ง€ ์ž‘์„ฑ์ž๊ฐ€ ์•Œ๋ ค์ฃผ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ

ENTRYPOINT ["nginx", "-g", "daemon off;"]
# ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋์„ ๋•Œ ๋‹จ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น ๊ฒฐ์ •

Next.js๋Š”? ์„œ๋ฒ„ ์‹คํ–‰์ด ํ•„์š”ํ•˜๋‹ค.

  • ๋งŒ์•ฝ next export๋กœ ์ •์  ๋ฆฌ์†Œ์Šค๋งŒ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ, ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋žœ๋”๋ง์ด ์—†์œผ๋ฏ€๋กœ ์„œ๋ฒ„ ๋„์ปค๋ผ์ด์ฆˆ ๊ณผ์ • ํ•„์š”x
  • next.config.js { output: "standalone" }
    • ํ”„๋กœ๋•์…˜์— ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋ชจ์•„์„œ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ค€๋น„
# Step 1: deps
FROM node:18-alpine as deps

WORKDIR /app

COPY package.json ./package.json
COPY pnpm-lock.yaml ./pnpm-lock.yaml

RUN npm install -g pnpm && \
    pnpm install

# Step 2: build
FROM node:18-alpine as build

WORKDIR /app

COPY --from=deps /app/node_modules ./node_modules
COPY . ./

RUN npm install -g pnpm && \
    pnpm build

# Step 3: runner
FROM node:18-alpine as runner

COPY --from=build /app/public ./public
COPY --from=build /app/.next/standalone ./public # CDN์œผ๋กœ ๋ณ„๋„๋กœ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜, standalone ๋‚ด๋ถ€์— ๋†“๊ฑฐ๋‚˜
COPY --from=build /app/.next/static ./.next/static

EXPOSE 3000

ENTRYPOINT ["node", "server.js"]

์ด๋ฏธ์ง€ ์—…๋กœ๋“œํ•˜๊ธฐ

  • ์—…๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์†Œ
    • AWS์˜ ECR, GCP์˜ Container Registry, Docker hub
    • credential์„ ์–ป๊ณ , ์›๊ฒฉ ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ ์ด๋ฆ„์— ๋งž๊ฒŒ ํƒœ๊ทธ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ํ‘ธ์‹œํ•œ๋‹ค

Google Cloud Platform ๊ฐ€์ž…ํ•˜๊ธฐ

  • ๋ฐฐํฌ ์™„๋ฃŒ ๐Ÿ‘: https://next-nmysy2cnia-uc.a.run.app/