- Switch Dockerfile from distroless/static to alpine:3.21 - Install openssh-client-default in runtime image - Mount SSH key in scheduler service (docker-compose) - Add NET_RAW capability for ping checks - Wire OIKOS_SSH_KEY_PATH and OIKOS_SSH_USER env vars in scheduler - sshExec uses configured key path with StrictHostKeyChecking=no
37 lines
977 B
Docker
37 lines
977 B
Docker
# 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"]
|