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 #

AspekLocal DevelopmentProduction
ServerUvicornUvicorn + Gunicorn
ReloadAktifTidak
DebugAktifDimatikan
Image sizeTidak kritisPenting

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"]
  • --reload memonitor 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 #

  1. Jalankan environment:

    docker compose up --build
    
  2. Akses API:

    • Swagger UI: http://localhost:8000/docs
    • ReDoc: http://localhost:8000/redoc
  3. Edit code → reload otomatis


Anti-Pattern #

  1. Satu Dockerfile untuk local & production
  2. Tidak menggunakan volume (reload tidak jalan)
  3. Hardcode config di source
  4. 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
About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact