- Published on
API Service with Go: Deploy with docker-compose
- Authors
- Name
- Somprasong Damyos
- @somprasongd
Deploy with docker-compose
เมื่อ API ของเราเสร็จแล้ว ตอนจะเอาไป deploy เพื่อใช้งานจริง นั้นมีหลายวิธี โดยในบทความนี้จะใช้วิธีการสร้างเป็น Docker Image แล้วไป deploy ใน Docker ด้วย docker-compose
โดยจะใช้ source code จาก Todo API
Dockerfile
เริ่มจากสร้าง Dockerfile เพื่อนำไปสร้าง Docker image
Dockerfile
FROM golang:1.18-buster AS build
WORKDIR /app
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY cmd ./cmd
COPY pkg ./pkg
ENV GOARCH=amd64
RUN go build -o /go/bin/app cmd/main.go
## Deploy
# FROM gcr.io/distroless/base-debian11
# COPY --from=build /go/bin/app /app
# EXPOSE 8080
# USER nonroot:nonroot
# CMD ["/app"]
FROM alpine:latest
RUN apk --no-cache add ca-certificates tzdata
WORKDIR /app
EXPOSE 8080
ENV TZ=Asia/Bangkok
ENV APP_MODE=production
COPY /go/bin/app /app
CMD ["/app"]
Build Docker Image
สร้าง docker image ด้วยคำสั่ง docker build -t todo-api:1.0.0 -f Dockerfile .
Run with Docker-compose
หลังจากได้ docker image มาแล้ว เมื่อจะนำไป deploy ใน docker จะใช้รันผ่าน docker-compose ซึ่งจำต้องสร้าง docker-compose.yml
ขึ้นมาดังนี้
version: '2.4'
services:
db:
image: postgres:12-alpine
container_name: todo-db
restart: always
environment:
- TZ=Asia/Bangkok
- PGTZ=Asia/Bangkok
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=S3cretp@ssw0rd
- POSTGRES_DB=todos
volumes:
- pg_data:/var/lib/postgresql/data
logging:
options:
max-size: 10m
max-file: '3'
healthcheck:
test: pg_isready -U postgres -h 127.0.0.1
interval: 10s
timeout: 5s
retries: 5
api:
image: todo-api:1.0.0
container_name: todo-api
restart: always
ports:
- 8080:8080
environment:
- TZ=Asia/Bangkok
- DB_DRIVER=postgres
- DB_HOST=db
- DB_PORT=5432
- DB_USERNAME=postgres
- DB_PASSWORD=S3cretp@ssw0rd
- DB_DATABASE=todos
depends_on:
db:
condition: service_healthy
volumes:
pg_data:
และรันด้วยคำสั่ง docker-compose up -d