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:
7
.dockerignore
Normal file
7
.dockerignore
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
*.md
|
||||||
|
Dockerfile
|
||||||
|
.dockerignore
|
||||||
|
.env*
|
||||||
|
.claude
|
||||||
42
Dockerfile
Normal file
42
Dockerfile
Normal 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"]
|
||||||
10
Makefile
10
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")
|
VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
|
||||||
LDFLAGS := -X main.Version=$(VERSION)
|
LDFLAGS := -X main.Version=$(VERSION)
|
||||||
@@ -29,11 +29,15 @@ test:
|
|||||||
# Build the binary
|
# Build the binary
|
||||||
build: ./bin/pixad
|
build: ./bin/pixad
|
||||||
|
|
||||||
./bin/pixad: ./internal/*/*.go ./cmd/pixad/*.go
|
./bin/pixad: ./internal/*/*.go ./cmd/pixad/*.go ./internal/static/* ./internal/templates/*
|
||||||
@echo "Building pixad..."
|
@echo "Building pixad..."
|
||||||
go build -ldflags "$(LDFLAGS)" -o $@ ./cmd/pixad
|
go build -ldflags "$(LDFLAGS)" -o $@ ./cmd/pixad
|
||||||
|
|
||||||
# Clean build artifacts
|
# Clean build artifacts
|
||||||
clean:
|
clean:
|
||||||
rm -rf bin/
|
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 .
|
||||||
|
|||||||
Reference in New Issue
Block a user