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
This commit is contained in:
2026-01-08 15:05:49 -08:00
parent 467237c849
commit 4b2d85010e
3 changed files with 56 additions and 3 deletions

7
.dockerignore Normal file
View File

@@ -0,0 +1,7 @@
.git
.gitignore
*.md
Dockerfile
.dockerignore
.env*
.claude

42
Dockerfile Normal file
View File

@@ -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"]

View File

@@ -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 .