вчера занимался ускорением скорости сборки 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
для 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