Flask #
Flask dikenal sebagai framework Python yang ringan, fleksibel, dan minim opini. Justru karena sifatnya yang minimalis, setup environment Flask sering kali sangat bergantung pada kebiasaan masing-masing developer.
Masalah yang sering muncul di tim Flask:
- Versi Python berbeda-beda
- Dependency bentrok antar project
- Cara menjalankan aplikasi tidak konsisten
- Setup database dan environment manual
Di sinilah Docker dan Docker Compose menjadi solusi ideal, khususnya untuk local development.
Artikel ini membahas secara mendetail dan rinci:
- Dockerfile yang tepat untuk Flask local development
- Docker Compose sebagai orkestrator environment lokal
- Workflow development Flask yang efisien
- Best practice serta anti-pattern yang sering terjadi
Fokus utama artikel ini adalah Docker Compose untuk local development, bukan production.
Filosofi Docker Flask #
Tujuan Docker di local development Flask adalah:
- Menyamakan environment Python & OS
- Mempercepat onboarding developer baru
- Mendukung iterasi cepat (edit → reload → test)
Bukan untuk:
- Image sekecil mungkin
- Setup production-ready
- Security hardening ekstrem
Prinsip sederhananya:
Local development fokus pada kecepatan dan konsistensi, bukan optimasi runtime.
Gambaran Arsitektur #
Setup Flask lokal umumnya terdiri dari:
- Aplikasi Flask
- Database (PostgreSQL / MySQL / SQLite)
- (Opsional) Redis / Worker
Diagram sederhana:
Developer
|
v
Docker Compose
|
+--> flask-app
|
+--> database
Struktur Project Flask #
Contoh struktur project Flask yang umum:
.
├── app/
│ ├── __init__.py
│ ├── routes.py
│ └── config.py
├── run.py
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
├── .env
└── .dockerignore
Karakteristik Dockerfile Flask #
| Aspek | Local Development | Production |
|---|---|---|
| Server | Flask dev server | gunicorn / uwsgi |
| Reload | Auto reload | Tidak perlu |
| Debug | Aktif | Dimatikan |
| Image size | Tidak kritis | Penting |
Kesalahan paling umum adalah menggunakan Dockerfile production untuk local development.
Dockerfile untuk Flask #
Prinsip Dasar #
- Gunakan Python slim image
- Install dependency eksplisit
- Aktifkan debug & auto reload
- Jalankan Flask development server
Contoh Dockerfile #
FROM python:3.12-slim
WORKDIR /app
# Konfigurasi Python
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# Install dependency OS
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
curl \
&& rm -rf /var/lib/apt/lists/*
# Install dependency Python
COPY requirements.txt .
RUN pip install --upgrade pip \
&& pip install -r requirements.txt
# Copy source code
COPY . .
EXPOSE 5000
CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"]
Penjelasan Dockerfile #
1. Base Image #
FROM python:3.12-slim
- Versi Python eksplisit
- Image ringan
- Ideal untuk local dev
2. Working Directory #
WORKDIR /app
Menjaga struktur project konsisten 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 dependency Python tertentu.
5. Install Dependency Python #
COPY requirements.txt .
RUN pip install -r requirements.txt
Layer ini di-cache Docker sehingga rebuild lebih cepat.
6. Copy Source Code #
COPY . .
Akan dioverride oleh volume di docker-compose.
7. Flask Development Server #
CMD ["flask", "run", "--host=0.0.0.0"]
- Debug & auto reload aktif
- Cocok untuk local development
Docker Compose #
Peran Docker Compose #
Docker Compose menyatukan:
- Flask application
- Database
- Environment variable
Dalam satu perintah.
Contoh docker-compose.yml #
version: "3.9"
services:
web:
container_name: flask-app
build:
context: .
dockerfile: Dockerfile
ports:
- "5000:5000"
volumes:
- .:/app
env_file:
- .env
depends_on:
- db
command: flask run --host=0.0.0.0 --port=5000
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 Flask App #
Port Mapping #
ports:
- "5000:5000"
Akses API via http://localhost:5000.
Volume Mount #
volumes:
- .:/app
- Sinkronisasi source code
- Auto reload Flask aktif
Environment Variable #
env_file:
- .env
Menjaga konfigurasi di luar source code.
2. Service Database #
- Image resmi PostgreSQL
- Data persisten via volume
Workflow Development #
Jalankan stack:
docker compose up --buildAkses aplikasi:
http://localhost:5000Edit code
Flask reload otomatis
Anti-Pattern #
- Menggunakan Dockerfile production untuk local
- Tidak mount volume (tidak auto reload)
- Menyimpan
.envdi image - Menganggap Flask = aplikasi kecil tanpa standar
Best Practice #
1. Gunakan .dockerignore
#
.git
__pycache__
.env
*.pyc
2. Aktifkan Debug via ENV #
FLASK_ENV=development
FLASK_DEBUG=1
3. Jangan Gunakan Gunicorn di Local Dev #
Gunicorn hanya untuk production.
4. Database Retry Logic #
depends_on tidak menjamin database siap.
Penutup #
Dockerfile dan Docker Compose untuk local development Flask seharusnya menekankan kecepatan iterasi dan konsistensi environment.
Dengan setup yang tepat:
- Development lebih cepat
- Onboarding lebih mudah
- Lingkungan lokal seragam