Push multi-platform image to Dockerhub with amd64, arm64
Problem
There are more and more arm64 servers, which are better for cost and performance. Our users would like to take advantage of that by deploying fleet on arm64 servers. We should provide an easy solution on Dockerhub, which is where our users primarily get Fleet.
Business Case
- Reduce cost for our community and customers
- Maintain Fleet at forefront of technology
Measurement
N/A
Requirements
- Dockerhub option available for deploying Fleet to Linux ARM64. Consider the suggestion here: https://github.com/fleetdm/fleet/issues/1845#issuecomment-1312379729
- Documentation There is a pre-existing segment of the
- Other depts. See if marketing wants to talk about this?
Design
UI
TODO
API
TODO
CLI
TODO
Related
Child issues
Interface team
- TODO
Platform team
- TODO
Agent team
- TODO
Documentation
- TODO
Here are some notes I wrote while testing on MacOS
Useful resources:
- https://docs.docker.com/registry/deploying/
- https://docs.docker.com/build/building/multi-platform/
- docker does not support local multi-platform images https://github.com/docker/buildx/issues/166#issuecomment-544827163
Run a local docker registry https://docs.docker.com/registry/deploying/. Note that on MacOS port 5000 is already used. Must map to a different port
docker run -d -p 5001:5000 --restart=always --name registry registry:2
Whenever you build, include the registry ie localhost:5001 in front of the tag eg --tag localhost:5001/fleetdm/fleet
Enable docker experimental (MacOS). Go to Docker Desktop Preferences -> Docker Engine and edit daemon.json with the following
"experimental": true,
Create a docker builder instance, with some extra configuration to use the local registry
Create buildkit.toml containing
[registry."host.docker.internal:5001"]
http = true
docker buildx create --use --config buildkit.toml
Here is a partial wip Dockerfile that uses builds fleet inside the image, instead of copying it from the docker build context.
FROM --platform=$BUILDPLATFORM golang:1.19.3-alpine3.16 as builder
ARG TARGETOS
ARG TARGETARCH
WORKDIR /src
COPY . .
RUN GOOS=$TARGETOS GOARCH=$TARGETARCH go build ...
Finally, build a multi platform image and push to local registry using
docker buildx build --platform linux/amd64,linux/arm64 -t docker.host.internal:5001/fleetdm/fleet:<version> --push -f Dockerfile .
And inspect it using
docker buildx imagetools inspect fleetdm/fleet:<version>
Hey @ksatter, heads up, we didn't have the space to take this on in the current design sprint (4.48).
Please feel free to bring it to the upcoming feature fest!
Any updates on this?
See also: https://github.com/fleetdm/fleet/issues/2466
Hi folks, any update on this?
Still no arm64 images at https://hub.docker.com/r/fleetdm/fleet
Any idea how these images are built? There's a thousand Dockerfiles and zero docs.
Add my updoot for this! Our clusters are predominantly ARM based!