Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Faster K3s Binary Build Option #7805

Merged
merged 6 commits into from
Jun 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
./.cache
./.dapper
./.trash-cache
./.git/objects/pack
Copy link
Member Author

@dereknola dereknola Jun 21, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This folder contains the bulk of the .git ~1.6GB size, but is not needed to extract the commit ID or branch when calling git status or other git info commands. Ignoring this folder enables a much lower copy of only some 40KB to docker containers and still allows use of the scripts/version.sh.

70 changes: 70 additions & 0 deletions Dockerfile.local
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
ARG GOLANG=golang:1.20.4-alpine3.18
FROM ${GOLANG} as infra

ARG http_proxy=$http_proxy
ARG https_proxy=$https_proxy
ARG no_proxy=$no_proxy
ENV http_proxy=$http_proxy
ENV https_proxy=$https_proxy
ENV no_proxy=$no_proxy

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 python3 py3-pip 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 binutils-gold btrfs-progs-dev btrfs-progs-static gawk yq \
&& \
if [ "$(go env GOARCH)" = "amd64" ]; then \
apk -U --no-cache add mingw-w64-gcc; \
fi

RUN python3 -m pip install awscli

# this works for both go 1.17 and 1.18
RUN GOPROXY=direct go install golang.org/x/tools/cmd/goimports@gopls/v0.11.0
RUN rm -rf /go/src /go/pkg

RUN if [ "$(go env GOARCH)" = "amd64" ]; then \
curl -sL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v1.51.2; \
fi

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 build

ARG SKIP_VALIDATE

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

COPY ./cmd ./cmd
COPY ./pkg ./pkg
COPY ./tests ./tests
COPY ./.git ./.git
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
8 changes: 7 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,10 @@ image-scan:

format:
gofmt -s -l -w $(GO_FILES)
goimports -w $(GO_FILES)
goimports -w $(GO_FILES)

.PHONY: local
local:
DOCKER_BUILDKIT=1 docker build \
--build-arg="REPO TAG GITHUB_TOKEN GOLANG GOCOVER DEBUG" \
-t k3s-local -f Dockerfile.local --output=. .
5 changes: 3 additions & 2 deletions scripts/binary_size_check.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

set -e

GO=${GO-go}
ARCH=${ARCH:-$("${GO}" env GOARCH)}

if [ "${DEBUG}" = 1 ]; then
set -x
fi

. ./scripts/version.sh

# Try to keep the K3s binary under 70 megabytes.
# "64M ought to be enough for anybody"
MAX_BINARY_MB=70
Expand Down
9 changes: 5 additions & 4 deletions scripts/validate
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
#!/bin/bash
set -e

if [ -n "$SKIP_VALIDATE" ]; then
echo Skipping validation
exit
fi

cd $(dirname $0)/..

echo Running: go mod tidy
Expand All @@ -9,10 +14,6 @@ go mod tidy
echo Running: go generate
go generate

if [ -n "$SKIP_VALIDATE" ]; then
echo Skipping validation
exit
fi
echo Running validation

. ./scripts/version.sh
Expand Down