From 4b2d85010e6294c10fe5120349c2205e64b9bf03 Mon Sep 17 00:00:00 2001 From: sneak Date: Thu, 8 Jan 2026 15:05:49 -0800 Subject: [PATCH] Add two-stage Dockerfile with CGO support - Build stage: golang:1.24-alpine with vips-dev for CGO image libs - Runtime stage: alpine:3.21 with vips runtime only - Pass VERSION build arg for ldflags embedding - Add 'make docker' target to build image with git version --- .dockerignore | 7 +++++++ Dockerfile | 42 ++++++++++++++++++++++++++++++++++++++++++ Makefile | 10 +++++++--- 3 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..5167f6c --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +.git +.gitignore +*.md +Dockerfile +.dockerignore +.env* +.claude diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8cc164a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,42 @@ +# Build stage +FROM golang:1.24-alpine AS builder + +ARG VERSION=dev + +# Install build dependencies for CGO image libraries +RUN apk add --no-cache \ + build-base \ + vips-dev \ + pkgconfig + +WORKDIR /src + +# Copy go mod files first for better layer caching +COPY go.mod go.sum ./ +RUN GOTOOLCHAIN=auto go mod download + +# Copy source code +COPY . . + +# Build with CGO enabled +RUN CGO_ENABLED=1 GOTOOLCHAIN=auto go build -ldflags "-X main.Version=${VERSION}" -o /pixad ./cmd/pixad + +# Runtime stage +FROM alpine:3.21 + +# Install runtime dependencies only +RUN apk add --no-cache \ + vips \ + ca-certificates \ + tzdata + +# Copy binary from builder +COPY --from=builder /pixad /usr/local/bin/pixad + +# Create non-root user +RUN adduser -D -H -s /sbin/nologin pixad +USER pixad + +EXPOSE 8080 + +ENTRYPOINT ["/usr/local/bin/pixad"] diff --git a/Makefile b/Makefile index 28557be..9cf7570 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: check lint test fmt build clean +.PHONY: check lint test fmt build clean docker VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev") LDFLAGS := -X main.Version=$(VERSION) @@ -29,11 +29,15 @@ test: # Build the binary build: ./bin/pixad -./bin/pixad: ./internal/*/*.go ./cmd/pixad/*.go +./bin/pixad: ./internal/*/*.go ./cmd/pixad/*.go ./internal/static/* ./internal/templates/* @echo "Building pixad..." go build -ldflags "$(LDFLAGS)" -o $@ ./cmd/pixad # Clean build artifacts clean: rm -rf bin/ - rm -f data.db + rm -rf ./data + +# Build Docker image +docker: + docker build --build-arg VERSION=$(VERSION) -t pixad:$(VERSION) -t pixad:latest .