Gin #

Gin adalah salah satu framework HTTP paling populer di ekosistem Go karena performanya tinggi, API sederhana, dan sangat cocok untuk membangun REST API maupun backend service modern.

Namun, pada praktiknya, setup local development Go Gin sering kali menemui masalah klasik:

  • Versi Go berbeda antar developer
  • Dependency tidak sinkron
  • Cara menjalankan service tidak konsisten
  • Setup database dan service pendukung manual

Di sinilah Dockerfile dan Docker Compose menjadi fondasi penting untuk menciptakan environment lokal yang konsisten, reproducible, dan cepat di-iterate.

Artikel ini membahas secara mendetail dan rinci:

  • Dockerfile khusus Go Gin 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 #

Tujuan utama penggunaan Docker di local development Go Gin:

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

Bukan tujuan utama:

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

Local development mengutamakan feedback loop cepat, bukan optimasi runtime.


Gambaran Arsitektur #

Arsitektur umum Go Gin lokal:

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

Struktur Project Go Gin #

Contoh struktur project yang umum:

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

Karakteristik Dockerfile Go Gin #

AspekLocal DevelopmentProduction
Buildgo run / airgo build
ReloadAktifTidak
DebugAktifMinimal
Image sizeTidak kritisPenting

Kesalahan umum: menggunakan Dockerfile production untuk local development.


Dockerfile Go Gin #

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 dependency OS
RUN apk add --no-cache git curl bash

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

# Copy go mod terlebih dahulu untuk cache
COPY go.mod go.sum ./
RUN go mod download

# Copy source code
COPY . .

EXPOSE 8080

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

Konfigurasi Air (.air.toml) #

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

Air memungkinkan hot reload native Go tanpa rebuild manual.


Penjelasan Dockerfile #

1. Base Image #

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

2. Install Hot Reload Tool #

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

Tanpa hot reload, Go akan sangat lambat untuk iterasi lokal.

3. Cache Dependency #

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

Layer ini jarang berubah → build lebih cepat.

4. Menjalankan Aplikasi #

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

Air memonitor perubahan file dan restart service otomatis.


Docker Compose #

Peran Docker Compose #

Docker Compose menyatukan:

  • Go Gin app
  • Database
  • Environment variable

Dalam satu perintah.

Contoh docker-compose.yml #

version: "3.9"

services:
  api:
    container_name: gin-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 Gin API #

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 #

  • PostgreSQL image resmi
  • Volume untuk persistensi data

Workflow Development #

  1. Jalankan environment:

    docker compose up --build
    
  2. Edit kode Go

  3. Air reload otomatis

  4. Test API


Anti-Pattern #

  1. Go run manual tanpa reload
  2. Menggunakan image production untuk local
  3. Tidak cache go mod download
  4. Menjalankan binary statis saat development

Best Practice #

1. Gunakan .dockerignore #

.git
bin
tmp
.env

2. Pisahkan Config via ENV #

Gunakan os.Getenv atau library config.

3. Jangan Matikan Hot Reload #

Go tanpa hot reload = DX buruk.


Penutup #

Dockerfile dan Docker Compose untuk local development Go Gin seharusnya dirancang untuk kecepatan iterasi dan konsistensi environment.

Dengan setup yang tepat:

  • Developer experience meningkat drastis
  • Bug environment berkurang
  • Tim lebih produktif
About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact