# Build stage # golang:1.25-alpine FROM golang@sha256:f6751d823c26342f9506c03797d2527668d095b0a15f1862cddb4d927a7a4ced AS builder RUN apk add --no-cache git make gcc musl-dev curl # Install golangci-lint v2.10.1 (prebuilt binary, multi-arch) RUN set -e; \ ARCH="$(uname -m)"; \ case "$ARCH" in \ x86_64) ARCH=amd64; SHA256="dfa775874cf0561b404a02a8f4481fc69b28091da95aa697259820d429b09c99" ;; \ aarch64) ARCH=arm64; SHA256="6652b42ae02915eb2f9cb2a2e0cac99514c8eded8388d88ae3e06e1a52c00de8" ;; \ *) echo "Unsupported arch: $ARCH" >&2; exit 1 ;; \ esac; \ curl -fsSL "https://github.com/golangci/golangci-lint/releases/download/v2.10.1/golangci-lint-2.10.1-linux-${ARCH}.tar.gz" -o /tmp/golangci-lint.tar.gz; \ echo "${SHA256} /tmp/golangci-lint.tar.gz" | sha256sum -c -; \ tar -xzf /tmp/golangci-lint.tar.gz -C /usr/local/bin --strip-components=1 "golangci-lint-2.10.1-linux-${ARCH}/golangci-lint"; \ rm /tmp/golangci-lint.tar.gz # Install goimports v0.42.0 RUN go install golang.org/x/tools/cmd/goimports@009367f5c17a8d4c45a961a3a509277190a9a6f0 WORKDIR /src COPY go.mod go.sum ./ RUN go mod download COPY . . # Run all checks - build fails if any check fails RUN make check # Build the binary RUN make build # Runtime stage # alpine:3.19 FROM alpine@sha256:6baf43584bcb78f2e5847d1de515f23499913ac9f12bdf834811a3145eb11ca1 RUN apk add --no-cache ca-certificates tzdata git openssh-client docker-cli WORKDIR /app COPY --from=builder /src/bin/upaasd /app/upaasd # Create data directory RUN mkdir -p /var/lib/upaas ENV UPAAS_DATA_DIR=/var/lib/upaas EXPOSE 8080 ENTRYPOINT ["/app/upaasd"]