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 #

AspekLocal DevelopmentProduction
ServerFlask dev servergunicorn / uwsgi
ReloadAuto reloadTidak perlu
DebugAktifDimatikan
Image sizeTidak kritisPenting

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 #

  1. Jalankan stack:

    docker compose up --build
    
  2. Akses aplikasi:

    http://localhost:5000
    
  3. Edit code

  4. Flask reload otomatis


Anti-Pattern #

  1. Menggunakan Dockerfile production untuk local
  2. Tidak mount volume (tidak auto reload)
  3. Menyimpan .env di image
  4. 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
About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact