вчера занимался ускорением скорости сборки multiarch образов, т.е. тех, что работают и на arm и на x86. Традиционный подход это строить арм через qemu, и все работает, но медленно. Для бэкенд проектов та часть, что для arm строилась на 2 минуты дольше чем для x86. Две минуты это, конечно, немного, но на фоне того, что интеловая часть строится за 20 секунд 2 лишних минуты это вечность.



для js магии это вообще ой, там оно доходило до 10 минут. Я до сих пор не понимаю, что такого они там своим yarn делают, что занимает столько времени (все зависимости кешированны, и все это время оно “компилирует” и собирает), но по любому - странный мир js мне не переделать, и проблему надо решать.



Вот эта заметка навела меня на правильное решение https://dev.to/jdrouet/building-multi-arch-docker-images-without-using-qemu-322c



Т.е. для сборки для арм оно будет само ходить на arm машинку! Это прелестно работает как для ручных билдов, так и для запуска из gitlab runner. Конечно, ваш runner надо тоже поменять подобны образом



вот вам полный Dockerfile для ранера. Все, что требуется от arm-runner.example.com это чтоб оно было arm64 машинкой на которой бежит голый докер и до которой вы можете достучаться по ssh





FROM alpine:3.15



ARG DOCKER_HOST="unix://var/run/docker.sock"

ENV DOCKER_HOST ${DOCKER_HOST}



RUN apk add --no-cache --update docker curl make openssh-client git



# ssh for internal gitlab access

ADD ssh/id_rsa /root/.ssh/id_rsa

ADD ssh/id_rsa.pub /root/.ssh/id_rsa.pub



RUN \

chmod 600 /root/.ssh/* && chmod 700 /root/.ssh && \

echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > /root/.ssh/config



RUN \

export DOCKER_BUILDKIT=1 && \

docker build --platform=local -o . git://github.com/docker/buildx && \

mkdir -p ~/.docker/cli-plugins && \

mv buildx ~/.docker/cli-plugins/docker-buildx



RUN docker run --rm --privileged docker/binfmt:820fdd95a9972a5308930a2bdfb8573dd4447ad3

RUN docker buildx create --name mybuilder

RUN docker buildx use mybuilder

RUN docker buildx inspect --bootstrap

RUN docker context create arm-runner --docker "host=ssh://[email protected]"

RUN docker buildx create --append --name mybuilder --platform linux/arm64 arm-runner