ARG GOLANG=golang:1.25.9-alpine3.22 FROM ${GOLANG} AS infra RUN apk -U --no-cache add bash git gcc musl-dev docker vim less file curl wget ca-certificates jq linux-headers \ zlib-dev tar zip squashfs-tools npm coreutils openssl-dev libffi-dev libseccomp libseccomp-dev \ libseccomp-static make libuv-static sqlite-dev sqlite-static libselinux libselinux-dev zlib-dev zlib-static \ zstd pigz alpine-sdk btrfs-progs-dev btrfs-progs-static gawk yq pipx \ && \ if [ "$(go env GOARCH)" = "arm64" ]; then \ apk -U --no-cache add binutils-gold; \ fi \ && \ if [ "$(go env GOARCH)" = "amd64" ]; then \ apk -U --no-cache add mingw-w64-gcc; \ fi # Install goimports RUN GOPROXY=direct go install golang.org/x/tools/cmd/goimports@gopls/v0.20.0 RUN rm -rf /go/src /go/pkg ARG SELINUX=true ENV SELINUX=$SELINUX ENV STATIC_BUILD=true ENV SRC_DIR=/go/src/github.com/k3s-io/k3s WORKDIR ${SRC_DIR}/ FROM infra AS manifests ARG GIT_TAG ARG TREE_STATE ARG COMMIT ARG DIRTY ARG GOOS ENV NO_DAPPER=true # Used by both build and validate stages, better caching if we do this in a separate stage COPY ./scripts/ ./scripts COPY ./go.mod ./go.sum ./main.go ./ COPY ./manifests ./manifests RUN mkdir -p bin dist RUN --mount=type=cache,id=gomod,target=/go/pkg/mod \ ./scripts/download FROM manifests AS validate ARG SKIP_VALIDATE COPY . . RUN --mount=type=cache,id=gomod,target=/go/pkg/mod \ --mount=type=cache,id=gobuild,target=/root/.cache/go-build \ --mount=type=cache,id=lint,target=/root/.cache/golangci-lint \ ./scripts/validate FROM manifests AS build ARG GOCOVER ARG DEBUG COPY ./cmd ./cmd COPY ./tests ./tests COPY ./pkg ./pkg RUN --mount=type=cache,id=gomod,target=/go/pkg/mod \ --mount=type=cache,id=gobuild,target=/root/.cache/go-build \ ./scripts/build COPY ./contrib ./contrib RUN --mount=type=cache,id=gomod,target=/go/pkg/mod \ --mount=type=cache,id=gobuild,target=/root/.cache/go-build \ ./scripts/package-cli RUN ./scripts/binary_size_check.sh FROM scratch AS result ENV SRC_DIR=/go/src/github.com/k3s-io/k3s COPY --from=build ${SRC_DIR}/dist /dist COPY --from=build ${SRC_DIR}/bin /bin COPY --from=build ${SRC_DIR}/build/out /build/out COPY --from=build ${SRC_DIR}/build/static /build/static COPY --from=build ${SRC_DIR}/pkg/static /pkg/static COPY --from=build ${SRC_DIR}/pkg/deploy /pkg/deploy