Skip to content

Instantly share code, notes, and snippets.

@adomaskizogian
Created July 10, 2024 11:34
Show Gist options
  • Select an option

  • Save adomaskizogian/80a45be70873b521599d64768f0de876 to your computer and use it in GitHub Desktop.

Select an option

Save adomaskizogian/80a45be70873b521599d64768f0de876 to your computer and use it in GitHub Desktop.
minmaxed multiplatform img build

minmaxed multiplatform img build

usecase

build binaries and upload them on gh release

build images and push to dockerhub

details

using buildx builds binaries targeting 4 different os/arch combinations and using the same Dockerfile builds 2 images targeting different archictectures.

reuses layers and caches between these 2 builds. uses host platform as much as possible to achieve fast go build, only uses target platform on the last stage.

FROM --platform=$BUILDPLATFORM golang:1.22.5-alpine AS base
WORKDIR /src
ENV CGO_ENABLED=0
COPY go.* .
RUN --mount=type=cache,target=/go/pkg/mod \
go mod download
FROM base AS builder-linux-amd64
RUN --mount=target=. \
--mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
GOOS='linux' GOARCH='amd64' go build -ldflags='-s -w' -o /out/artisan cmd/artisan/main.go
FROM base AS builder-linux-arm64
RUN --mount=target=. \
--mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
GOOS='linux' GOARCH='arm64' go build -ldflags='-s -w' -o /out/artisan cmd/artisan/main.go
FROM base AS builder-darwin-amd64
RUN --mount=target=. \
--mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
GOOS='darwin' GOARCH='amd64' go build -ldflags='-s -w' -o /out/artisan cmd/artisan/main.go
FROM base AS builder-darwin-arm64
RUN --mount=target=. \
--mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
GOOS='darwin' GOARCH='arm64' go build -ldflags='-s -w' -o /out/artisan cmd/artisan/main.go
FROM scratch AS output-all
COPY --from=builder-linux-arm64 /out/artisan /artisan-linux-arm64
COPY --from=builder-linux-arm64 /out/artisan /artisan-linux-amd64
COPY --from=builder-darwin-arm64 /out/artisan /artisan-darwin-arm64
COPY --from=builder-darwin-amd64 /out/artisan /artisan-darwin-amd64
FROM builder-${TARGETOS}-${TARGETARCH} AS output
FROM --platform=$TARGETPLATFORM cimg/aws:2024.03.1
COPY --from=output /out/artisan /usr/local/bin/artisan
ENTRYPOINT [ "artisan" ]
.PHONY: artifacts
artifacts:
docker buildx build . --build-arg BUILDPLATFORM=linux/amd64 --platform=linux/amd64 --target output-all --output artifacts
.PHONY: build
build:
docker buildx build . --build-arg BUILDPLATFORM=linux/amd64 --platform=linux/arm64,linux/amd64
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment