in Traffic Control, we build an Alpine image <
https://github.com/apache/trafficcontrol/pkgs/container/trafficcontrol%2Fci%2Ftrafficserver-alpine>,
with Traffic Server baked into it, for amd64 and arm64 . Rather than
building them both from the same machine, the amd64 and arm64 images in
separate GitHub Actions jobs, then combined using `docker manifest` in a
third GitHub Actions job <
https://github.com/apache/trafficcontrol/blob/master/.github/workflows/container-trafficserver-alpine.yml
>.

The arm64 part still takes much longer (over 2 hours, compare to 10 minutes
for amd64), but this approach eliminates the need to build for more than
one platform at a time, so if the arm64 job were to run on an arm64 runner
in the future, that wouldn't need to further complicate the other jobs in
order to take advantage of that speedup.

-Zach

On Tue, Dec 6, 2022 at 9:02 AM Jarek Potiuk <ja...@potiuk.com> wrote:

> In Airflow we have a bit more complex setting (we are building 2x5x2
> different images and they are different sets of them for different
> branches), Building images for Airflow takes quite some time (installing
> many dependencies) so qemu was out of the question (several hours to build
> single image). Unfortunately qemu is ~ 15 times (!) slower than hardware
> builds from our experience. Good enough for small images, but unacceptable
> if your image normally takes time
>
> The built-in actions like the one mentioned by Jacob have the limitations
> that they depende on qemu - I have not yet found an easy "Action" that
> could utilise AMD and ARM hardware together. But maybe there are other
> ways.
>
> We developed our own scripting and tooling:
>
> * we have self-hosted runners in GitHub and we only use those to build
> images (with Astronomer money and Amazon-sponsored credits on AWS)
> * for the time when we build multi-platform build we start ARM instances
> (they have built-in timed auto-kill-switch so that they are not run
> indefinitely and take resources)
> * we configured ssh-forwarded docker port from our AMD instance to forward
> docker socket
> * we configured two builder with buildx (local for AMD and the forwarded
> one for ARM)
> * we run multi-platform buildx build to use both builders.
> * we have our own Python build/development environment (breeze) that wraps
> the docker commands that are executed so the "code" doing it is not easy to
> copy elsewhere sometimes, but I copied below the actual "meat" what happens
> under the hood.
> * we run it as part of our Github Action workflows
>
> Examples:
>
> * Starting ARM instance and configuring builders:
> https://github.com/apache/airflow/actions/runs/3603432288/jobs/6080260757
>
> This is the relevant part of establishing the worker for buildx (I omit
> starting the instance as it is amazon-specific):
>
> export AUTOSSH_LOGFILE="${WORKING_DIR}/autossh.log"
> autossh -f "-L12357:/var/run/docker.sock" \
>     -N -o "IdentitiesOnly=yes" -o "StrictHostKeyChecking=no" \
>     -i "${WORKING_DIR}/my_key" "${EC2_USER}@${INSTANCE_PRIVATE_DNS_NAME}"
>
> bash -c 'echo -n "Waiting port 12357 .."; for _ in `seq 1 40`; do echo -n
> .; sleep 0.25; nc -z localhost 12357 && echo " Open." && exit ; done; echo
> " Timeout!" >&2; exit 1'
>
> docker buildx rm --force airflow_cache || true
> docker buildx create --name airflow_cache
> docker buildx create --name airflow_cache --append localhost:12357
>
> * Releasing image:
> https://github.com/apache/airflow/actions/runs/3603432288/jobs/6080260776
>
> This is the command that is run under-the-hood
>
> docker buildx build --builder airflow_cache --build-arg
> PYTHON_BASE_IMAGE=python:3.10-slim-bullseye --build-arg
> AIRFLOW_VERSION=2.5.0 --platform linux/amd64,linux/arm64 . -t
> apache/airflow:2.5.0-python3.10 --push
>
> J.
>
>
>
> On Tue, Dec 6, 2022 at 2:10 PM Jacob Wujciak <ja...@voltrondata.com.invalid
> >
> wrote:
>
> > Hello Robert,
> >
> > I would suggest using GItHub Actions, there you can use the official
> suite
> > of docker actions to build multiplatform images with little need for
> custom
> > scripting [1].
> > Feel free to ping me in the ASF slack.
> >
> > Best
> > Jacob
> >
> > [1]: https://github.com/docker/build-push-action
> >
> > On Tue, Dec 6, 2022 at 1:43 PM Robert Munteanu <romb...@apache.org>
> wrote:
> >
> > > Hi,
> > >
> > > We had a user report that our official Docker image does not support
> > > architectures other than AMD64 [1]. M1 Macs and Raspberry Pis can't run
> > > the image with our current setup.
> > >
> > > On our side, we set up automated builds on Docker Hub using automated
> > > builds. Unforunately, Docker Hub autobuilds don't support `docker
> > > buildx` or another form of multi-arch builds. It is not the roadmap
> > > though [2], but here is no guarantee on when (or if) it will become
> > > available.
> > >
> > > I see two alternatives so far:
> > >
> > > 1. Moving to GitHub actions
> > > 2. Use hooks to install qemu and 'fake' a multi-arch build on Docker
> > > Hub
> > >
> > > To be honest, none is too appealing to me, we have a simple process
> > > that works.
> > >
> > > How are other projects handling this? Or does anyone have any ideas
> > > that they can share?
> > >
> > > Thanks,
> > > Robert
> > >
> > > [1]: https://issues.apache.org/jira/browse/SLING-11714
> > > [2]: https://github.com/docker/roadmap/issues/109
> > >
> >
>

Reply via email to