-
-
Save AverageMarcus/78fbcf45e72e09d9d5e75924f0db4573 to your computer and use it in GitHub Desktop.
| FROM --platform=${BUILDPLATFORM:-linux/amd64} golang:1.16 as builder | |
| ARG TARGETPLATFORM | |
| ARG BUILDPLATFORM | |
| ARG TARGETOS | |
| ARG TARGETARCH | |
| WORKDIR /app/ | |
| ADD . . | |
| RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -ldflags="-w -s" -o yourapplication main.go | |
| FROM --platform=${TARGETPLATFORM:-linux/amd64} scratch | |
| WORKDIR /app/ | |
| COPY --from=builder /app/yourapplication /app/yourapplication | |
| ENTRYPOINT ["/app/yourapplication"] |
| .DEFAULT_GOAL := default | |
| IMAGE ?= yourapplication:latest | |
| export DOCKER_CLI_EXPERIMENTAL=enabled | |
| .PHONY: build # Build the container image | |
| build: | |
| @docker buildx create --use --name=crossplat --node=crossplat && \ | |
| docker buildx build \ | |
| --output "type=docker,push=false" \ | |
| --tag $(IMAGE) \ | |
| . | |
| .PHONY: publish # Push the image to the remote registry | |
| publish: | |
| @docker buildx create --use --name=crossplat --node=crossplat && \ | |
| docker buildx build \ | |
| --platform linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x \ | |
| --output "type=image,push=true" \ | |
| --tag $(IMAGE) \ | |
| . |
It's been a while since I looked at this but I have this setup in one of my projects that is working at least when it last built a couple years ago - https://github.com/AverageMarcus/kube-image-prefetch/blob/master/Dockerfile
You're correct, sorry, these args are defined by docker. When I declared them before FROM, they became empty. Thanks for this example, helped me a lot.
I’m so glad to hear that! 😁
@AverageMarcus I am trying to understand from your above Makefile what is the difference between build and publish as both looks pretty same except platform difference.
@cherrymu The --output is what makes the difference.
--output "type=image,push=true"
This instructs the command to push to the remote registry whereas this..
--output "type=docker,push=false"
...just builds the image on the local machine.
Thanks @AverageMarcus for clarifying it
I might be wrong, but according to docker docs BUILDPLATFORM should be defined as ARG before the first FROM too.
https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact