48 lines
1.4 KiB
Text
48 lines
1.4 KiB
Text
|
|
# Dockerfile for go-places.
|
||
|
|
#
|
||
|
|
# The Go module lives in api/, so the build runs with api/ as the working
|
||
|
|
# directory. The version here has to be at least the `go` directive in
|
||
|
|
# api/go.mod, otherwise the toolchain refuses to build.
|
||
|
|
|
||
|
|
# --- Build stage ---
|
||
|
|
FROM golang:1.24-alpine AS builder
|
||
|
|
|
||
|
|
WORKDIR /src
|
||
|
|
|
||
|
|
# Copy the module definition first so dependency downloads stay cached when only
|
||
|
|
# application code changes.
|
||
|
|
COPY api/go.mod api/go.sum ./
|
||
|
|
RUN go mod download
|
||
|
|
|
||
|
|
COPY api/ ./
|
||
|
|
|
||
|
|
# CGO is not needed: the SQLite driver is the pure-Go modernc.org/sqlite.
|
||
|
|
RUN CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags '-s -w' -o /out/go-places ./cmd
|
||
|
|
|
||
|
|
# --- Final stage ---
|
||
|
|
FROM alpine:3.20
|
||
|
|
|
||
|
|
# ca-certificates lets the remote analyzer reach an HTTPS inference service.
|
||
|
|
# wget backs the container healthcheck below.
|
||
|
|
RUN apk add --no-cache ca-certificates wget
|
||
|
|
|
||
|
|
# The service runs unprivileged and needs to own the directories it writes to.
|
||
|
|
RUN adduser -D -u 10001 places \
|
||
|
|
&& mkdir -p /app/data/media \
|
||
|
|
&& chown -R places:places /app
|
||
|
|
WORKDIR /app
|
||
|
|
|
||
|
|
COPY --from=builder /out/go-places /app/go-places
|
||
|
|
|
||
|
|
USER places
|
||
|
|
|
||
|
|
ENV ADDR=":8080" \
|
||
|
|
DATABASE_URL="file:/app/data/go-places.db?_pragma=busy_timeout(5000)&_pragma=journal_mode(WAL)&_pragma=foreign_keys(1)" \
|
||
|
|
MEDIA_DIR="/app/data/media"
|
||
|
|
|
||
|
|
EXPOSE 8080
|
||
|
|
|
||
|
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
|
||
|
|
CMD wget -qO- "http://127.0.0.1:8080/healthz" || exit 1
|
||
|
|
|
||
|
|
ENTRYPOINT ["/app/go-places"]
|