2026년 7월 21일 화요일

# Dockerfile - python + uv + node + tailwindcss + fastapi



# Dockerfile - python + uv + node + tailwindcss + fastapi

```Dockerfile
# pyproject.toml의 버전이 3.13으로 올라갔다면, 빌드할 때 인자만 바꿔줍니다.
# docker build --build-arg PYTHON_VERSION=3.13 -t my-fastapi-app .

# === 1단계: Tailwind CSS 빌드 환경 (Node) ===
FROM node:20-slim AS css-builder
WORKDIR /build

# 빌드에 필요한 소스 파일들을 도커 내부로 복사
COPY templates/ ./templates/
COPY static/ ./static/

# 3. 🚀 도커 안에서 직접 초압축 배포 빌드 명령어를 실행!
RUN npx @tailwindcss/cli -i ./static/src/input.css -o ./static/css/output.css --minify

# === 2단계: 실제 FastAPI 서비스 실행 환경 (Python + uv) ===
# 1. 외부에서 주입받을 파이썬 버전의 기본값을 정해둡니다.
ARG PYTHON_VERSION=3.12

# 2단계: 실제 실행용 경량화 스테이지
#FROM python:${PYTHON_VERSION}-slim
#FROM python:${PYTHON_VERSION}-slim-bookworm
FROM astralsh/uv:python:${PYTHON_VERSION}-slim AS python-builder

WORKDIR /app

# uv가 소스코드를 가상환경에 동기화할 때 바이트코드를 미리 생성하여 속도를 높입니다.
ENV UV_COMPILE_BYTECODE=1
ENV UV_LINK_MODE=copy

# 2. 파이썬 패키지 설치 (캐시 최적화)
# uv.lock 또는 requirements.txt를 먼저 복사하여 의존성을 먼저 굽습니다.
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-cache

# 3. 내 소스 파일들 제 위치로 복사 🚀
COPY app/ ./app/
COPY templates/ ./templates/

# === 3단계: 최종 실행 환경 (가장 슬림함) ===
FROM python:${PYTHON_VERSION}-slim
WORKDIR /app

# 2단계에서 완성된 uv 가상환경(.venv) 복사
COPY --from=python-builder /app/.venv /app/.venv

# 파이썬 소스 코드 및 HTML 파일 복사
COPY app/ ./app/
COPY templates/ ./templates/

# 1단계에서 빌드가 완공된 완제품 static 폴더(output.css 포함)만 쏙 가져옴
COPY --from=css-builder /build/static/ ./static/

# 컨테이너 외부 접근을 위해 8000번 포트를 열어둡니다.
EXPOSE 8000

# 앞서 배웠던 Production 최적화 명령어 'fastapi run'으로 서버를 가동합니다.
CMD ["fastapi", "run", "app/main.py", "--host", "0.0.0.0", "--port", "8000"]
```

---

```bash
# build.sh
#!/bin/bash

# 1. pyproject.toml에서 'requires-python = ">=3.12"' 같은 라인을 찾아 숫자만 추출합니다.
# (정규식을 이용해 3.12 같은 버전 숫자만 자동으로 따옵니다.)
PYTHON_VER=$(grep -oE 'requires-python\s*=\s*"[^"]+"' pyproject.toml | grep -oE '[0-9]+\.[0-9]+')

echo "🎯 pyproject.toml에서 인식된 파이썬 버전: $PYTHON_VER"

# 2. 추출한 버전을 도커 ARG 인자로 넘겨주며 빌드합니다.
# 'my-fastapi-app'이라는 이름으로 도커 이미지를 빌드합니다.
#docker build --build-arg PYTHON_VERSION=$PYTHON_VER -t my-fastapi-app .

# 내 컴퓨터의 8000 포트와 도커의 8000 포트를 연결하고 백그라운드(-d)로 실행합니다.
#docker run -d -p 8000:8000 --name fastapi-server my-fastapi-app
```

---

```yaml
# deploy.yml
- name: pyproject.toml에서 파이썬 버전 추출하기
  id: get-version
  uses: c-py/action-current-python-version@v1
  with:
    pyproject-toml: "pyproject.toml"

- name: 자동으로 인식된 버전으로 도커 빌드하기
  run: |
    docker build --build-arg PYTHON_VERSION=${{ steps.get-version.outputs.version }} -t my-fastapi-app .

```


database.py

import os from contextlib import contextmanager # contextmanager 임포트 from typing import Generator from dotenv...