Cloud Dev v1 Dockerfile - 100-hours-a-week/KTB4-1st-wiki GitHub Wiki
์ ํ๋ฆฌ์ผ์ด์ Docker Image ๊ตฌ์ฑ
์๋น์ค๋ณ Dockerfile ๊ตฌ์กฐ
| ์๋น์ค | ๋ฐํ์ | ๋น๋ ์ ๋ต | ํฌํธ |
|---|---|---|---|
| Backend | |||
| Frontend | Next.js | ๋ฉํฐ์คํ
์ด์ง (node ๋น๋ โ node ๋ฐํ์, standalone node server.js) |
3000 |
| AI | FastAPI | ๋จ์ผ ์คํ ์ด์ง | 8000 |
- ๋๋ฏธ ์ฑ์ ํฌ์ค์ฒดํฌ ์๋ํฌ์ธํธ๋ง ์ ๊ณตํ๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ์์
- ์ถํ ์ฝ๋๊ฐ ์์ฑ๋๋ฉด ์ฝ๋๋ง ๋ฃ์ด Docker Image๋ก ๋น๋ํ ์ ์์ด์ผ ํจ
- Frontend, AI๋ tobby๊ฐ, Backend๋ janna๊ฐ ์์ฑํ๋ค. ์ด ๋ฌธ์์ Dockerfile์ Frontend, AI๋ค.
์ต์ ํ ๋ฒ์ ๊ฒฐ์
์์ฑ ์ ๊ณํํ ์ต์ ํ ๋ฒ์๋ ๋ค์ 4๋จ๊ณ์๋ค.
- COPY/RUN๋ง์ผ๋ก ๊ธฐ๋ณธ ๋น๋
- ์ด๋ฏธ์ง ํฌ๊ธฐ ์ถ์ โ ๋ฉํฐ์คํ ์ด์ง ๋น๋, Next.js standalone ๋ชจ๋
- ๋น๋ ์๋ ๊ฐ์ โ ์ด๋ฏธ์ง ๋ ์ด์ด ๋ฐฐ์น, BuildKit cache mount
- ๊ฐ ๋จ๊ณ๋ง๋ค ์งํ๋ฅผ ๋๊ณ ๊ฐ์ ํญ ์ธก์
์ด ๋ฒ์๋ v1์ ๋ฐฐํฌ ๋ชฉํ์ ๋ง์ง ์์๋ค. v1์ ๊ธฐ์ค์ ์ ์ ๋น์ฉ๊ณผ ๋น ๋ฅธ ๋ฐฐํฌ์ธ๋ฐ, ์ ๊ณํ์ ํ๋ก๋์ ์์ค์ ์ธ๋ฐํ ์ต์ ํ์ ํด๋นํ๋ค๊ณ ํ๋จํ๋ค. ๋น์ฉ์ ์ง์ ์ํฅ์ ์ฃผ๋ ํญ๋ชฉ๊ณผ ์ง๊ธ ๊ธํ์ง ์์ ํญ๋ชฉ์ ๊ตฌ๋ถํ์ง ์๊ณ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ค ํ ๊ฒ์ด ๋ฌธ์ ์๋ค.
๊ทธ๋์ ๋น์ฉ์ ๊ฐ์ฅ ํฌ๊ฒ ์ํฅ์ ์ฃผ๋ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ง v1์ ์ต์ ํ ๋์์ผ๋ก ์ขํ๋ค.
| ํญ๋ชฉ | v1 ์ ์ฉ | ํ๋จ ๊ทผ๊ฑฐ |
|---|---|---|
| ์ด๋ฏธ์ง ํฌ๊ธฐ (๋ฉํฐ์คํ ์ด์ง, standalone) | ์ ์ฉ | GHCR ์ ์ก๋๊ณผ EC2 ๋ฃจํธ ๋ณผ๋ฅจ ์ฌ์ฉ๋์ ์ง์ ์ํฅ. ๋จ์ผ ์ธ์คํด์ค์ ํ์ฌ ์ด๋ฏธ์ง์ ๋กค๋ฐฑ์ฉ ์ด์ ์ด๋ฏธ์ง๊ฐ ํจ๊ป ๋จ๋๋ค |
| ์์กด์ฑ ๋ ์ด์ด ๋ถ๋ฆฌ (์์กด์ฑ ํ์ผ ๋จผ์ COPY) | ์ ์ฉ | ๋ ์ค๋ก ๋๋๊ณ PR๋ง๋ค ๋๋ CI ๋น๋ ์๊ฐ์ ๋ฐ๋ก ๋ฐ์๋๋ค |
| BuildKit cache mount | ์ ์ธ | ๋น๋ ์๋ ํญ๋ชฉ. v1 ๊ท๋ชจ์์ CI ์๊ฐ์ด ์์ง ๋ฌธ์ ๊ฐ ์๋๋ค |
| non root ์ ์ ์คํ | ์ ์ธ | ๋ณด์ ํญ๋ชฉ. v1์ ๋ถํธ์บ ํ ๋ด๋ถ ์ ์ฉ ์๋น์ค์ด๋ฉฐ, ์ฐ์ ์์๋ฅผ ์ด๋ฏธ์ง ํฌ๊ธฐ์ ๋์๋ค |
Dockerfile ๊ณตํต ์๊ตฌ์ฌํญ
- linux/arm64 (AWS EC2 t4g.medium)
- ํ์ ๋ชจ๋ Mac(arm64)๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋ก์ปฌ, ์ด์ ํ๊ฒฝ ๋ชจ๋ arm64๋ง ํ์ํจ
- Github Actions ๋ฌ๋
- Github Actions Runner๋ ๊ธฐ๋ณธ์ ์ผ๋ก x86(amd64)
- ARM์ฉ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ธฐ ์ํด์๋ ARM ๋ฌ๋๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ๊ฑฐ๋ QEMU buildx๋ก ํฌ๋ก์ค ๋น๋ ํ์(๋ค์ดํฐ๋ธ ๋น๋์ ๋นํด ๋๋ฆผ)
- ๋ฐ๋ผ์ Github Actions์์ runs on์ผ๋ก ๋ค์ดํฐ๋ธ arm64 ๋ฌ๋๋ฅผ ์ฌ์ฉํด ๋น๋ํ๋ค
- ์ค์ ์ฝ๋๊ฐ ๋์ค์ ๋ค์ด์๋ ๋ณ๊ฒฝ ์์ด ๋น๋ํ ์ ์์ด์ผ ํจ
- ํ๊ฒฝ ๋ณ์๋ ๋ฐํ์์ ์ฃผ์
- NEXT.js์ NEXT_PUBLIC_ ์ ์ธ
- HEALTHCHECK์ docker compose์์ ๊ด๋ฆฌํด, ์ด๋ ์ชฝ์ด ๋กค๋ฐฑ์ ํธ๋ฆฌ๊ฑฐ๊ฐ ๋์๋์ง ์ถ์ ํ๊ธฐ ์ฝ๋๋ก ํ๋ค.
ํ๋ก ํธ์๋ Dockerfile
Next.js๋ ์์ฒญ๋ง๋ค ์๋ฒ์์ ๋ ๋๋งํ๋ Node ํ๋ก์ธ์ค์ด๋ฏ๋ก(์ค๊ณ ๋ฌธ์์ FE โ BE SSR ํธ์ถ) ์ ์ ํ์ผ๋ก ๋ด๋ณด๋ผ ์ ์๊ณ , ์ปจํ
์ด๋๋ก ๋จ๋
์คํํด์ผ ํ๋ค. ๋ฐ๋ผ์ output: 'standalone'์ ์ ์ ๋ก ํ๋ค.
๊ธฐ๋ณธ ๊ตฌ์ฑ (๋น๊ต์ฉ)
FROM node:22
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]
- ์ด๋ฏธ์ง ํฌ๊ธฐ 2.61 GB
- ๋จ์ผ ์คํ ์ด์ง์ด๋ฏ๋ก ๋น๋ ๋๊ตฌ, devDependencies, ์์ค๊ฐ ๋ชจ๋ ์ต์ข ์ด๋ฏธ์ง์ ๋จ๋๋ค
์ฑํ ๊ตฌ์ฑ โ ๋ฉํฐ์คํ ์ด์ง + standalone
FROM node:24.21.0-alpine AS builder
WORKDIR /app
# ์์กด์ฑ ํ์ผ๋ง ๋จผ์ ๋ณต์ฌํ์ฌ ์ค์น
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:24.21.0-alpine AS runner
WORKDIR /app
ENV HOSTNAME=0.0.0.0
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public
EXPOSE 3000
CMD ["node", "server.js"]
- ์ด๋ฏธ์ง ํฌ๊ธฐ 284.92 MB โ ๊ธฐ๋ณธ ๊ตฌ์ฑ์ ์ฝ 1/9
output: 'standalone'์ ์ด์์ ์ค์ ๋ก ํ์ํ ํ์ผ๋ง ๊ณจ๋ผ์ฃผ๊ณ , ๋ฉํฐ์คํ ์ด์ง๋ ๊ทธ๊ฒ๋ง ์ต์ข ์ด๋ฏธ์ง์ ์ฎ๊ธด๋ค..next/standalone์๋.next/static๊ณผpublic์ด ํฌํจ๋์ง ์์ ๋ณ๋๋ก COPYํ๋ค..next/static์ด ๋น ์ง๋ฉด ํ์ด์ง๋ ๋จ์ง๋ง JS/CSS๊ฐ 404๊ฐ ๋๋คENV HOSTNAME=0.0.0.0โ standaloneserver.js๋ ๊ธฐ๋ณธ์ ์ผ๋ก localhost์ ๋ฐ์ธ๋ฉํ๋ค. 0.0.0.0์ผ๋ก ์ด์ง ์์ผ๋ฉด Nginx ์ปจํ ์ด๋์์ ์ ๊ทผํ ์ ์๋คnpm install๋์npm ciโ lock ํ์ผ ๊ทธ๋๋ก ์ค์น- ์ฑ์ด ๋ ํฌ ๋ฃจํธ๊ฐ ์๋ ํ์ ๋๋ ํฐ๋ฆฌ(
ktb_agile_frontend/)์ ์์ผ๋ฏ๋ก Dockerfile์ ํ์ ๋๋ ํ ๋ฆฌ์ ๋์๋ค. - Frontend Dockerfile PR
AI Dockerfile
FROM python:3.13.13-slim
WORKDIR /app
COPY . .
RUN pip install --no-cache-dir -r requirements.txt
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
- ์ด๋ฏธ์ง ํฌ๊ธฐ 268.32 MB
- Python์ ์ปดํ์ผ ์ฐ์ถ๋ฌผ์ด ์์ด์ ํ๋ก ํธ์๋์ ๋ฌ๋ฆฌ ๋จ์ผ ์คํ ์ด์ง๋ก ๋์ด๋ ํฌ๊ธฐ๊ฐ ์ถฉ๋ถํ ์๋ค
--no-cache-dirโ pip์ด ๋ด๋ ค๋ฐ์ wheel์~/.cache/pip์ ์ ์ฅํ๋๋ฐ ์ด๊ฒ์ด ๋ ์ด์ด์ ๋จ์ผ๋ฏ๋ก ์ ์ด์ ๋ง๋ค์ง ์๋๋ก ์ค์ ํ๋ค--host 0.0.0.0โ uvicorn์ ๊ธฐ๋ณธ ๋ฐ์ธ๋ฉ์127.0.0.1์ด๋ฉฐ, ๊ทธ๋๋ก ๋๋ฉด ์ปจํ ์ด๋ ์์ ๋ง ์ ์ํ ์ ์์ด ๋ฐฑ์๋ ์ปจํ ์ด๋์ ์์ฒญ์ด ๋ฟ์ง ์๋๋ค- AI ์๋ฒ๋ ๋ฐฑ์๋๋ง ํธ์ถํ๋ฏ๋ก compose์์
ports:๋ฅผ ๊ณต๊ฐํ์ง ์๊ณ ๋ด๋ถ ๋คํธ์ํฌ๋ก๋ง ๋๋ค - AI Dockerfile PR
์ค์ ์ฝ๋ ๋ฐ์ ์ ํ์ธํ ์กฐ๊ฑด
Dockerfile์ด ๊ฐ ๋ ํฌ์ ๊ตฌ์กฐ์ ์์กดํ๋ ์ง์ ์ผ๋ก, ๋ฐ๋๋ฉด Dockerfile์ ํจ๊ป ์์ ํด์ผ ํ๋ค.
| ์๋น์ค | ์กฐ๊ฑด |
|---|---|
| Frontend | next.config์ output: 'standalone' |
| Frontend | package.json + package-lock.json, npm run build ์คํฌ๋ฆฝํธ |
| Frontend | public/ ๋๋ ํฐ๋ฆฌ ์กด์ฌ |
| Frontend | ํด๋ผ์ด์ธํธ์์ ์ฐ๋ API ์ฃผ์๋ ์๋ ๊ฒฝ๋ก(/api). NEXT_PUBLIC_*๋ ๋น๋ ์์ ์ ๋ฒ๋ค์ ์ธ๋ผ์ธ๋๋ฏ๋ก ๋ฐํ์ ์ฃผ์
์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค. ์ ๋ URL์ด ํ์ํด์ง๋ฉด ARG ์ถ๊ฐ์ dev/prod ์ด๋ฏธ์ง ๋ถ๋ฆฌ๊ฐ ํ์ํ๋ค |
| AI | requirements.txt๊ฐ ์ปจํ
์คํธ ๋ฃจํธ์ ์์ ๊ฒ |
| AI | app/main.py์ FastAPI ์ธ์คํด์ค๋ช
์ด app์ผ ๊ฒ |