2.2 KiB
2.2 KiB
docker-compose.yml
services:
db:
image: postgres:15
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_NAME}
volumes:
- db_data:/var/lib/postgresql/data
- ./migrations:/docker-entrypoint-initdb.d
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"]
interval: 5s
timeout: 5s
retries: 5
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
adminer:
image: adminer
restart: always
ports:
- "8081:8080"
depends_on:
db:
condition: service_healthy
app:
build: .
environment:
DB_HOST: db
DB_USER: ${DB_USER}
DB_PASSWORD: ${DB_PASSWORD}
DB_NAME: ${DB_NAME}
DB_PORT: "5432"
LOG_LEVEL: "debug"
ports:
- "8080:8080"
depends_on:
db:
condition: service_healthy
deploy:
resources:
limits:
cpus: '1'
memory: 1G
volumes:
db_data:
pgdata_dev:
networks:
default:
name: matching_network
driver: bridge
Dockerfile
# Build stage
FROM golang:1.23-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o matching-app cmd/server/main.go
# Final image
FROM alpine:3.18
WORKDIR /app
# Add non-root user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
# Copy binary and resources
COPY --from=builder --chown=appuser:appgroup /app/matching-app .
COPY --from=builder --chown=appuser:appgroup /app/migrations ./migrations
COPY --from=builder --chown=appuser:appgroup /app/configs ./configs
# Environment variables
ENV APP_PORT=8080
ENV APP_ENV=production
# Install wget for healthcheck
RUN apk --no-cache add wget
# Healthcheck
HEALTHCHECK --interval=30s --timeout=3s \
CMD wget --no-verbose --tries=1 --spider http://localhost:${APP_PORT}/health || exit 1
EXPOSE ${APP_PORT}
USER appuser
ENTRYPOINT ["/app/matching-app"]
CMD []