Published on

API Service with Go: Deploy with docker-compose

Authors

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 --from=build /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