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 #
| Aspek | Local Development | Production |
|---|---|---|
| Build | go run / air | go build |
| Reload | Aktif | Tidak |
| Debug | Aktif | Minimal |
| Image size | Tidak kritis | Penting |
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 #
Jalankan environment:
docker compose up --buildEdit kode Go
Air reload otomatis
Test API
Anti-Pattern #
- Go run manual tanpa reload
- Menggunakan image production untuk local
- Tidak cache
go mod download - 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