# Ein Image für sultan server und sultan agent, Multi-Arch (amd64 + arm64): # # docker buildx build --platform linux/amd64,linux/arm64 -t --push . # docker build -t sultan:latest . # nur die eigene Architektur, lokal # # Go kompiliert auf der Build-Plattform für die Zielarchitektur (kein QEMU # nötig); das Laufzeit-Image enthält nur das statische Binary. FROM --platform=$BUILDPLATFORM golang:1.26 AS build ARG TARGETOS TARGETARCH ARG VERSION=dev WORKDIR /src COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH \ go build -trimpath -ldflags "-s -w -X sultan/pkg/cli.Version=${VERSION}" -o /out/sultan . \ && mkdir -p /out/suldata FROM gcr.io/distroless/static-debian12:nonroot ARG VERSION=dev LABEL org.opencontainers.image.title="sultan" \ org.opencontainers.image.version="${VERSION}" \ org.opencontainers.image.source="https://git.everdc.eu/chmln-app-dev/sultan" COPY --from=build /out/sultan /usr/local/bin/sultan # Datenverzeichnis gehört dem nonroot-User (65532); ein Named Volume übernimmt # das, ein Bind-Mount muss vorher per chown 65532:65532 vorbereitet werden. COPY --from=build --chown=65532:65532 /out/suldata /suldata # WORKDIR / → der Default ./suldata ist /suldata; `sultan token …` braucht kein --data-dir. WORKDIR / # Kein ENTRYPOINT: Compose ruft "sultan server …" bzw. "sultan agent …" auf # (Spec 7), `docker compose exec sultan-server sultan token …` funktioniert so ebenfalls. CMD ["sultan", "help"]