Chi #

Chi adalah router HTTP yang sangat ringan dan idiomatik di ekosistem Go. Chi tidak membawa banyak abstraksi seperti framework besar, sehingga sering dipilih untuk service yang:

  • Fokus pada kesederhanaan
  • Mengikuti standar net/http
  • Mudah di-maintain dalam jangka panjang

Namun, justru karena Chi minimalis, setup local development sering kali berbeda-beda antar developer:

  • Versi Go tidak seragam
  • Cara menjalankan service tidak konsisten
  • Tidak ada hot reload
  • Setup database dan dependency manual

Di sinilah Dockerfile dan Docker Compose berperan penting sebagai fondasi environment lokal yang konsisten, reproducible, dan cepat di-iterate.

Artikel ini membahas secara mendetail dan rinci:

  • Dockerfile khusus Go Chi local development
  • Docker Compose sebagai orkestrator environment lokal
  • Workflow development yang efisien
  • Best practice dan anti-pattern yang sering terjadi

Fokus utama artikel ini adalah Docker Compose untuk local development, bukan production.

Filosofi Docker Go Chi #

Tujuan utama penggunaan Docker di local development Go Chi:

  • Menyamakan versi Go dan OS
  • Menghilangkan masalah works on my machine
  • Mempercepat onboarding developer baru
  • Mendukung hot reload

Bukan tujuan utama:

  • Binary sekecil mungkin
  • Image production-grade
  • Hardening security ekstrem

Local development mengutamakan feedback loop cepat, bukan optimasi runtime.


Gambaran Arsitektur #

Arsitektur umum Go Chi lokal:

Developer
   |
   v
Docker Compose
   |
   +--> chi-app (hot reload)
   |
   +--> database (PostgreSQL / MySQL)

Struktur Project Go Chi #

Contoh struktur project Go Chi yang umum dan scalable:

.
├── cmd/
│   └── api/
│       └── main.go
├── internal/
│   ├── http/
│   │   ├── handler.go
│   │   └── router.go
│   ├── service/
│   └── repository/
├── pkg/
├── go.mod
├── go.sum
├── Dockerfile
├── docker-compose.yml
├── .env
├── .air.toml
└── .dockerignore

Chi sangat cocok dipadukan dengan struktur cmd/ dan internal/ yang idiomatik di Go.


Karakteristik Dockerfile Go Chi #

AspekLocal DevelopmentProduction
Buildgo build + airgo build static
ReloadAktifTidak
DebugAktifMinimal
Image sizeTidak kritisPenting

Kesalahan umum: menggunakan Dockerfile production untuk local development.


Dockerfile Go Chi #

Prinsip Dasar #

  • Gunakan image Go resmi
  • Aktifkan hot reload
  • Cache dependency Go
  • Jalankan app via tool reload

Contoh Dockerfile #

FROM golang:1.22-alpine

WORKDIR /app

# Install OS dependency
RUN apk add --no-cache git curl bash

# Install air for hot reload
RUN go install github.com/air-verse/air@latest

# Cache Go dependencies
COPY go.mod go.sum ./
RUN go mod download

# Copy source code
COPY . .

EXPOSE 8080

CMD ["air", "-c", ".air.toml"]

Konfigurasi Hot Reload dengan Air #

root = "."

tmp_dir = "tmp"

[build]
  cmd = "go build -o ./tmp/main ./cmd/api"
  bin = "./tmp/main"
  include_ext = ["go", "tpl", "tmpl", "html"]
  exclude_dir = ["vendor", "tmp"]

[log]
  time = true

Tanpa hot reload, iterasi Go Chi akan terasa lambat.


Penjelasan Dockerfile #

1. Base Image #

FROM golang:1.22-alpine
  • Versi Go eksplisit
  • Image ringan
  • Cocok untuk local dev

2. Hot Reload Tool #

RUN go install github.com/air-verse/air@latest

Chi tidak menyediakan hot reload bawaan, sehingga tool eksternal sangat penting.

3. Dependency Cache #

COPY go.mod go.sum ./
RUN go mod download

Mencegah go mod download berulang kali saat rebuild.

4. Menjalankan Aplikasi #

CMD ["air", "-c", ".air.toml"]

Air akan memonitor perubahan file dan me-restart server otomatis.


Docker Compose #

Peran Docker Compose #

Docker Compose menyatukan:

  • Go Chi application
  • Database
  • Environment variable

Dalam satu perintah sederhana.


Contoh docker-compose.yml #

version: "3.9"

services:
  api:
    container_name: chi-app
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    volumes:
      - .:/app
    env_file:
      - .env
    depends_on:
      - db

  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 Go Chi #

Volume Mount #

volumes:
  - .:/app
  • Sinkronisasi source code
  • Hot reload berjalan optimal

Port Mapping #

ports:
  - "8080:8080"

Akses API via http://localhost:8080.

2. Service Database #

  • Image resmi PostgreSQL
  • Data persisten via volume

Workflow Development #

  1. Jalankan stack:

    docker compose up --build
    
  2. Edit kode Go

  3. Air reload otomatis

  4. Test endpoint


Anti-Pattern #

  1. Menjalankan Go tanpa hot reload
  2. Menggunakan Dockerfile production untuk local
  3. Tidak cache go mod download
  4. Logic bisnis bercampur di handler

Best Practice #

1. Gunakan .dockerignore #

.git
tmp
bin
.env

2. Pisahkan Config via ENV #

Gunakan os.Getenv atau library config ringan.

3. Jaga Chi Tetap Tipis #

Jangan memaksa Chi menjadi framework besar.


Penutup #

Dockerfile dan Docker Compose untuk local development Go Chi seharusnya dirancang untuk kesederhanaan, kecepatan iterasi, dan konsistensi environment.

Dengan setup yang tepat:

  • Developer experience meningkat
  • Setup lokal lebih bersih
  • Service lebih mudah dirawat
About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact