55 lines
1.3 KiB
Docker
55 lines
1.3 KiB
Docker
# Stage 1: Build frontend assets
|
|
FROM node:24-alpine AS frontend-builder
|
|
WORKDIR /app
|
|
|
|
# Enable pnpm via corepack
|
|
RUN corepack enable pnpm
|
|
|
|
# Install dependencies
|
|
COPY package.json pnpm-lock.yaml ./
|
|
RUN pnpm install --frozen-lockfile
|
|
|
|
# Copy source and build assets
|
|
COPY . .
|
|
RUN pnpm run build:css && pnpm run build:js
|
|
|
|
# Stage 2: Build Go binary
|
|
FROM golang:1.26-alpine AS go-builder
|
|
WORKDIR /app
|
|
|
|
# Install git for potential private modules (though not strictly needed here)
|
|
RUN apk add --no-cache git
|
|
|
|
# Download Go modules
|
|
COPY go.mod go.sum ./
|
|
RUN go mod download
|
|
|
|
# Copy source code
|
|
COPY . .
|
|
|
|
# Copy built frontend assets from the previous stage
|
|
COPY --from=frontend-builder /app/web/static/css/output.css ./web/static/css/
|
|
COPY --from=frontend-builder /app/web/static/js/htmx.min.js ./web/static/js/
|
|
|
|
# Generate templ files using the tool defined in go.mod
|
|
RUN go tool templ generate
|
|
|
|
# Build the optimized binary
|
|
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /app/server ./cmd/schreifuchs-ch
|
|
|
|
# Stage 3: Final minimal image
|
|
FROM alpine:latest
|
|
WORKDIR /app
|
|
|
|
# Install root certificates and timezone data
|
|
RUN apk --no-cache add ca-certificates tzdata
|
|
|
|
# Copy the compiled binary from the builder stage
|
|
COPY --from=go-builder /app/server .
|
|
|
|
# Expose the application port
|
|
EXPOSE 8080
|
|
|
|
# Set the entrypoint
|
|
ENTRYPOINT ["/app/server"]
|