FastHttp #
FastAPI menjadi pilihan populer untuk membangun API modern di Python karena performanya tinggi, berbasis ASGI, dan developer experience yang sangat baik.
Namun, di banyak tim, setup local development FastAPI sering tidak konsisten:
- Versi Python berbeda antar developer
- Dependency bertabrakan
- Cara menjalankan server tidak seragam (uvicorn manual, script custom, dll)
- Setup database dan service pendukung masih manual
Di sinilah Dockerfile dan Docker Compose berperan penting sebagai single source of truth untuk environment lokal.
Artikel ini membahas secara mendetail dan rinci bagaimana:
- Menyusun Dockerfile FastAPI khusus local development
- Menggunakan Docker Compose sebagai orkestrator environment
- Membangun workflow development yang cepat dan konsisten
- Menghindari anti-pattern umum FastAPI + Docker
Fokus artikel ini adalah local development, bukan production.
Filosofi Docker FastAPI #
Tujuan utama Docker di local development FastAPI:
- Menyamakan environment (Python, OS, dependency)
- Mempermudah onboarding developer baru
- Mendukung iterasi cepat (edit → reload → test)
Bukan tujuan utama:
- Optimasi image size ekstrem
- Hardening security
- Setup production-ready
Local development mengutamakan kecepatan feedback loop, bukan efisiensi runtime.
Gambaran Arsitektur #
Arsitektur umum FastAPI lokal:
Developer
|
v
Docker Compose
|
+--> fastapi-app (uvicorn --reload)
|
+--> database (PostgreSQL)
Struktur Project FastAPI #
Contoh struktur project yang umum digunakan:
.
├── app/
│ ├── main.py
│ ├── api/
│ ├── core/
│ └── models/
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
├── .env
└── .dockerignore
Karakteristik Dockerfile FastAPI #
| Aspek | Local Development | Production |
|---|---|---|
| Server | Uvicorn | Uvicorn + Gunicorn |
| Reload | Aktif | Tidak |
| Debug | Aktif | Dimatikan |
| Image size | Tidak kritis | Penting |
Kesalahan umum: menggunakan Dockerfile production untuk local development.
Dockerfile FastAPI #
Prinsip Dasar #
- Gunakan image Python resmi
- Aktifkan auto-reload
- Dependency di-cache
- Jalankan uvicorn langsung
Contoh Dockerfile #
FROM python:3.12-slim
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
curl \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install --upgrade pip \
&& pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
Penjelasan Dockerfile #
1. Base Image #
FROM python:3.12-slim
- Python versi eksplisit
- Image ringan
- Cocok untuk local dev
2. Working Directory #
WORKDIR /app
Menjaga konsistensi path di container.
3. Environment Variable Python #
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
- Mencegah file
.pyc - Log langsung ke stdout
4. Dependency OS #
Digunakan untuk build package Python tertentu (psycopg, dll).
5. Install Dependency Python #
COPY requirements.txt .
RUN pip install -r requirements.txt
Dependency di-cache Docker → rebuild lebih cepat.
6. Menjalankan FastAPI #
CMD ["uvicorn", "app.main:app", "--reload"]
--reloadmemonitor perubahan file- Ideal untuk local development
Docker Compose #
Peran Docker Compose #
Docker Compose menyatukan:
- FastAPI app
- Database
- Environment variable
Dalam satu perintah.
Contoh docker-compose.yml #
version: "3.9"
services:
api:
container_name: fastapi-app
build:
context: .
dockerfile: Dockerfile
ports:
- "8000:8000"
volumes:
- .:/app
env_file:
- .env
depends_on:
- db
command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
db:
image: postgres:16-alpine
container_name: postgres-db
environment:
POSTGRES_DB: app_db
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Penjelasan docker-compose.yml #
1. Service FastAPI #
Port Mapping #
ports:
- "8000:8000"
Akses API via http://localhost:8000.
Volume Mount #
volumes:
- .:/app
- Source code sinkron
- Auto reload bekerja optimal
2. Service Database #
- PostgreSQL image resmi
- Volume untuk persistensi data
Workflow Development #
Jalankan environment:
docker compose up --buildAkses API:
- Swagger UI:
http://localhost:8000/docs - ReDoc:
http://localhost:8000/redoc
- Swagger UI:
Edit code → reload otomatis
Anti-Pattern #
- Satu Dockerfile untuk local & production
- Tidak menggunakan volume (reload tidak jalan)
- Hardcode config di source
- Menganggap FastAPI selalu siap production tanpa tuning
Best Practice #
1. Gunakan .dockerignore
#
.git
__pycache__
.env
*.pyc
2. Pisahkan Config via ENV #
Gunakan Pydantic BaseSettings.
3. Jangan Jalankan Gunicorn di Local Dev #
Gunicorn hanya relevan untuk production.
4. Perhatikan Startup Dependency #
depends_on tidak menjamin database siap.
Penutup #
Dockerfile dan Docker Compose untuk local development FastAPI harus memprioritaskan kecepatan iterasi dan konsistensi environment.
Dengan setup yang tepat:
- Developer experience meningkat
- Bug environment berkurang
- Onboarding lebih cepat