# Multi-stage Dockerfile for Oikos (ADR 0001: single binary) # Stage 1: build web UI FROM node:22-alpine AS ui-builder WORKDIR /web COPY web/package.json web/package-lock.json ./ RUN npm ci COPY web/ ./ RUN npm run build # Stage 2: build Go binary FROM golang:1.26-alpine AS builder RUN apk add --no-cache git ca-certificates WORKDIR /build COPY go.mod go.sum ./ RUN go mod download COPY . . # Bring in the built SPA so //go:embed all:dist (web/embed.go) has real assets. COPY --from=ui-builder /web/dist ./web/dist RUN CGO_ENABLED=0 go build -o /oikos -tags timetzdata -ldflags="-s -w" ./cmd/oikos # --- Runtime: alpine with SSH + ping for scheduler checks --- FROM alpine:3.21 RUN apk add --no-cache ca-certificates openssh-client-default COPY --from=builder /oikos /oikos COPY --from=builder /build/seeds /seeds COPY --from=builder /build/migrations /migrations # web/dist is embedded in the binary (web/embed.go) — no runtime copy needed. ENTRYPOINT ["/oikos"]