From 29642bfd148f70a74bec57ba5969b340d9032723 Mon Sep 17 00:00:00 2001 From: KidusAlemayehu Date: Mon, 12 May 2025 01:58:53 +0300 Subject: [PATCH 1/2] add Dockerfile and docker-compose.yml; update makefile for Docker integration --- Dockerfile | 17 +++++++++++++ compose.db.yaml => docker-compose.yml | 20 ++++++++++++++- makefile | 36 ++++++++++++++++++--------- 3 files changed, 60 insertions(+), 13 deletions(-) create mode 100644 Dockerfile rename compose.db.yaml => docker-compose.yml (66%) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..048901b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +# Builder stage +FROM golang:1.24-alpine AS builder + +WORKDIR /app +COPY go.mod go.sum ./ +RUN go mod download +COPY . . +RUN go build -ldflags="-s -w" -o ./bin/web ./cmd/main.go + +# Runner stage +FROM alpine:3.21 +WORKDIR /app +COPY .env . +COPY --from=builder /app/bin/web /app/bin/web +RUN apk add --no-cache ca-certificates +EXPOSE ${PORT} +CMD ["/app/bin/web"] \ No newline at end of file diff --git a/compose.db.yaml b/docker-compose.yml similarity index 66% rename from compose.db.yaml rename to docker-compose.yml index 72ab8a7..6ee411f 100644 --- a/compose.db.yaml +++ b/docker-compose.yml @@ -1,3 +1,5 @@ +version: '3.9' + services: postgres: image: postgres:16-alpine @@ -14,6 +16,7 @@ services: interval: 5s timeout: 3s retries: 5 + migrate: image: migrate/migrate volumes: @@ -32,6 +35,21 @@ services: networks: - app + app: + build: + context: . + dockerfile: Dockerfile + ports: + - ${PORT}:8080 + environment: + - DB_URL=postgresql://root:secret@postgres:5432/gh?sslmode=disable + depends_on: + migrate: + condition: service_completed_successfully + networks: + - app + command: ["/app/bin/web"] + networks: app: - driver: bridge + driver: bridge \ No newline at end of file diff --git a/makefile b/makefile index 79017cf..54ac98c 100644 --- a/makefile +++ b/makefile @@ -1,41 +1,53 @@ include .env .PHONY: test test: - @go test ./app + @docker compose exec app go test ./app + .PHONY: coverage coverage: @mkdir -p coverage - @go test -coverprofile=coverage.out ./internal/... - @go tool cover -func=coverage.out -o coverage/coverage.txt + @docker compose exec app go test -coverprofile=coverage.out ./internal/... + @docker compose exec app go tool cover -func=coverage.out -o coverage/coverage.txt + .PHONY: build build: - @go build -ldflags="-s" -o ./bin/web ./ + @docker compose build app + .PHONY: run run: - @echo "Running Go application" - @go run ./cmd/main.go + @docker compose up -d + +.PHONY: stop +stop: + @docker compose down + .PHONY: air air: - @echo "Running air" + @echo "Running air locally (not in Docker)" @air -c .air.toml -.PHONY: migrations/up + +.PHONY: migrations/new migrations/new: @echo 'Creating migration files for DB_URL' @migrate create -seq -ext=.sql -dir=./db/migrations $(name) + .PHONY: migrations/up migrations/up: @echo 'Running up migrations...' - @migrate -path ./db/migrations -database $(DB_URL) up + @docker compose up migrate .PHONY: swagger swagger: @swag init -g cmd/main.go + .PHONY: db-up db-up: - docker compose -f compose.db.yaml up + @docker compose up -d postgres + .PHONY: db-down db-down: - docker compose -f compose.db.yaml down + @docker compose down + .PHONY: sqlc-gen sqlc-gen: - @sqlc generate + @sqlc generate \ No newline at end of file From 8d7911375b082b79c8ea68e4e9c19f8d78710c51 Mon Sep 17 00:00:00 2001 From: KidusAlemayehu Date: Mon, 12 May 2025 02:31:36 +0300 Subject: [PATCH 2/2] refactor Dockerfile and docker-compose.yml for multi-stage builds; update makefile for test execution --- Dockerfile | 2 +- docker-compose.yml | 13 +++++++++++++ makefile | 10 +++++++--- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 048901b..6a4fd5a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ COPY . . RUN go build -ldflags="-s -w" -o ./bin/web ./cmd/main.go # Runner stage -FROM alpine:3.21 +FROM alpine:3.21 AS runner WORKDIR /app COPY .env . COPY --from=builder /app/bin/web /app/bin/web diff --git a/docker-compose.yml b/docker-compose.yml index 6ee411f..4bbf5e6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -39,6 +39,7 @@ services: build: context: . dockerfile: Dockerfile + target: runner ports: - ${PORT}:8080 environment: @@ -50,6 +51,18 @@ services: - app command: ["/app/bin/web"] + + test: + build: + context: . + dockerfile: Dockerfile + target: builder + volumes: + - .:/app + command: ["tail", "-f", "/dev/null"] + networks: + - app + networks: app: driver: bridge \ No newline at end of file diff --git a/makefile b/makefile index 54ac98c..5b62eb3 100644 --- a/makefile +++ b/makefile @@ -1,13 +1,17 @@ include .env .PHONY: test test: - @docker compose exec app go test ./app + @docker compose up -d test + @docker compose exec test go test ./... + @docker compose stop test .PHONY: coverage coverage: @mkdir -p coverage - @docker compose exec app go test -coverprofile=coverage.out ./internal/... - @docker compose exec app go tool cover -func=coverage.out -o coverage/coverage.txt + @docker compose up -d test + @docker compose exec test sh -c "go test -coverprofile=coverage.out ./internal/... && go tool cover -func=coverage.out -o coverage/coverage.txt" + @docker cp $(shell docker ps -q -f "name=fortunebet-test-1"):/app/coverage ./ || true + @docker compose stop test .PHONY: build build: