Я решил собственную проблему после небольшого исследования ... Во-первых, я совершил глупую ошибку, а во-вторых, я забыл очень важную вещь.Вот как я исправил свои проблемы:
Глупая ошибка
Хотя я указал разные Dockerfile
с для каждой автоматической сборки, у меня также был хук build
, который перезаписывал docker build
команда и по умолчанию Dockerfile
для всех сборок, вместо выбора нужного файла.
Исправлено build
файл хука:
#!/bin/bash
docker build \
--file "${DOCKERFILE_PATH}" \
--build-arg BUILD_DATE="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \
--build-arg VCS_REF="$(git rev-parse --short HEAD)" \
--tag "$IMAGE_NAME" \
.
Важная вещь
Как и @JanGaraj, упомянутый в его ответе, Docker Hub работает на amd64
и не может запускать двоичные файлы для других архитектур.Так как же построить многоархитивные образы с помощью Docker Hub Automated Builds?С помощью qemu-user-static
и более крючков.Я нашел ответ на этой проблеме GitHub , но я опубликую здесь полный ответ на мой конкретный пример использования:
Мое дерево примера проекта:
.
├── Dockerfile
├── Dockerfile.aarch64
├── Dockerfile.armhf
└── hooks
├── build
├── post_checkout
└── pre_build
Файл хука post_checkout
:
#!/bin/bash
BUILD_ARCH=$(echo "${DOCKERFILE_PATH}" | cut -d '.' -f 2)
[ "${BUILD_ARCH}" == "Dockerfile" ] && \
{ echo 'qemu-user-static: Download not required for current arch'; exit 0; }
QEMU_USER_STATIC_ARCH=$([ "${BUILD_ARCH}" == "armhf" ] && echo "${BUILD_ARCH::-2}" || echo "${BUILD_ARCH}")
QEMU_USER_STATIC_DOWNLOAD_URL="https://github.com/multiarch/qemu-user-static/releases/download"
QEMU_USER_STATIC_LATEST_TAG=$(curl -s https://api.github.com/repos/multiarch/qemu-user-static/tags \
| grep 'name.*v[0-9]' \
| head -n 1 \
| cut -d '"' -f 4)
curl -SL "${QEMU_USER_STATIC_DOWNLOAD_URL}/${QEMU_USER_STATIC_LATEST_TAG}/x86_64_qemu-${QEMU_USER_STATIC_ARCH}-static.tar.gz" \
| tar xzv
Файл хука pre_build
:
#!/bin/bash
BUILD_ARCH=$(echo "${DOCKERFILE_PATH}" | cut -d '.' -f 2)
[ "${BUILD_ARCH}" == "Dockerfile" ] && \
{ echo 'qemu-user-static: Registration not required for current arch'; exit 0; }
docker run --rm --privileged multiarch/qemu-user-static:register --reset
Файл Dockerfile
:
FROM amd64/alpine:3.8
(...)
Файл Dockerfile.aarch64
:
FROM arm64v8/alpine:3.8
COPY qemu-aarch64-static /usr/bin/
(...)
Файл Dockerfile.armhf
:
FROM arm32v6/alpine:3.8
COPY qemu-arm-static /usr/bin/
(...)
Вот и все!