Pulls the deploy infra forward from §10 so m can see slice 1 on his LAN.
- Dockerfile: multi-stage golang:1.25-alpine → distroless/static-debian12.
CGO_ENABLED=0 (modernc.org/sqlite is pure Go). USER 1000:1000 so the
bind-mount on mDock (owned by m:m) is writable without chowning the
host dir. -trimpath + -s -w; 12.2MB final image.
- docker-compose.yml: matches the mDock convention surveyed earlier
(container_name explicit, restart: unless-stopped, env_file in
/home/m/secrets/mcables/.env, bind-mount /home/m/stacks/mcables/data,
port 7777 exposed on LAN). Image temporarily under the mai/ namespace
on mgit.msbls.de because mAi doesn't have write access to m/* today —
documented in a comment so retagging is one line when permissions land.
- .dockerignore: keeps .git, .worktrees, .m, data/, docs/, *.md,
editor cruft out of the build context.
Manual deploy verified end-to-end:
- docker build → image sha256:76624f17 (12.2MB)
- mAi-authenticated push to mgit.msbls.de/mai/mcables:latest
- ssh mdock anonymous pull works (registry allows public reads on this
namespace)
- POST /api/projects {"name":"LOFT"} returns the row, GET /api/projects
shows it; docker compose restart preserves it on disk; second GET
still shows LOFT.
Gitea Actions auto-deploy left for a follow-up task per the head's
instruction — gets us the moving parts right first.
37 lines
1.1 KiB
Docker
37 lines
1.1 KiB
Docker
# syntax=docker/dockerfile:1.7
|
|
#
|
|
# mCables — single-stage build → distroless runtime image.
|
|
# go.mod requires go 1.25; modernc.org/sqlite is pure Go so CGO_ENABLED=0
|
|
# and a distroless/static runtime is all we need.
|
|
|
|
FROM golang:1.25-alpine AS build
|
|
WORKDIR /src
|
|
|
|
# Cache deps before copying the rest of the source.
|
|
COPY go.mod go.sum ./
|
|
RUN go mod download
|
|
|
|
COPY . .
|
|
|
|
# -trimpath strips local paths from the binary; -s -w drops debug info.
|
|
RUN CGO_ENABLED=0 GOOS=linux go build \
|
|
-trimpath \
|
|
-ldflags="-s -w" \
|
|
-o /out/mcables \
|
|
./cmd/mcables
|
|
|
|
FROM gcr.io/distroless/static-debian12:nonroot
|
|
WORKDIR /app
|
|
COPY --from=build /out/mcables /app/mcables
|
|
|
|
ENV MCABLES_ADDR=0.0.0.0:7777 \
|
|
MCABLES_DB=/app/data/mcables.db
|
|
|
|
EXPOSE 7777
|
|
# Run as UID:GID 1000:1000 to match m on mDock — the bind-mounted
|
|
# /home/m/stacks/mcables/data is owned by m:m, so the container can write
|
|
# to it without chowning the host dir. distroless/static-debian12 accepts
|
|
# arbitrary numeric UIDs; the Go binary doesn't need a /etc/passwd entry.
|
|
USER 1000:1000
|
|
ENTRYPOINT ["/app/mcables"]
|