Процесс сборки, работающий на локальном ПК, вызывает ошибки при запуске на DockerHub в виде автоматической сборки.
Ссылка на ветку, где я пытаюсь использовать автоматическую сборку ARM: https://github.com/psyciknz/ParadoxIP150v2/tree/homie-and-events
Сборка AMD64 отлично работает на DockerHub.
Подписано: Как создать образ Docker на конкретной архитектуре с помощью Docker Hub?
Перейдя по указанной выше ссылке, мне удалось решить проблему с загрузкой правильного qemu (я пробовал x86_64-qemu-arm-static и qemu-arm-static), мне удалось обойти все проблемы, с которыми я столкнулся нет файлов Docker в главном каталоге исходных текстов (я использую следующую структуру):
/
applicationcode.py
Docker
Dockerfile
Dockerfile.arm32v7
Dockerfile.arm64v8
hooks
build
post_checkout
pre_build
Теперь моя текущая проблема заключается в том, что в файле Docker он выдает:
RUN pip install paho-mqtt requests
и в журналах сборки DockerHub я получаю:
Status: Downloaded newer image for arm32v7/python:2.7.15-jessie
---> a0873323b42b
Step 2/12 : COPY qemu-arm-static /usr/bin/
---> 49f090a8faac
Step 3/12 : RUN pip install paho-mqtt requests
---> Running in 2d6bb52d61bd
standard_init_linux.go:190: exec user process caused "permission denied"
The command '/bin/sh -c pip install paho-mqtt requests' returned a non-zero code: 1
build hook failed! (1)
Где хук сборки:
#!/bin/bash
# Get the name of the docker file (without path)
BUILD_FILE=$(echo Docker/Dockerfile.arm32v7 | cut -d '/' -f 2)
echo 'starting build'
echo ${DOCKERFILE_PATH}
echo ${BUILD_FILE}
echo ${IMAGE_NAME}
docker build \
-f "${DOCKERFILE_PATH}" \
-t "${IMAGE_NAME}" \
.
Это простая команда сборки. Даже без этого я получаю ту же ошибку.
Вот post_checkout:
#!/bin/bash
BUILD_ARCH=$(echo "${DOCKERFILE_PATH}" | cut -d '.' -f 2)
echo ${BUILD_ARCH}
[ "${BUILD_ARCH}" == "Dockerfile" ] &&
{ echo 'qemu-user-static: Download not required for current arch'; exit 0; }
if [ "${BUILD_ARCH}" == "arm64v8" ]; then
echo 'arm64'
QEMU_USER_STATIC_ARCH=$([ "${BUILD_ARCH}" == "arm64v8" ] && echo "aarch64" || echo "${BUILD_ARCH}")
else
QEMU_USER_STATIC_ARCH=$([ "${BUILD_ARCH}" == "arm32v7" ] && echo "${BUILD_ARCH::-4}" || echo "${BUILD_ARCH}")
echo 'arm'
fi
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}/qemu-${QEMU_USER_STATIC_ARCH}-static" -o "qemu-${QEMU_USER_STATIC_ARCH}-static"
echo 'Directory (should be Docker)'
pwd
ls -la
echo 'Default uname'
uname -a
Я добавил несколько дополнительных команд, чтобы выяснить, где я нахожусь в файловой системе, и получить список файлов.
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
Arm32 DockerFile.
FROM arm32v7/python:2.7.15-jessie
#copy qemu from Docker/hooks (when on DockerHub)
COPY qemu-arm-static /usr/bin/
# based on https://github.com/pfichtner/docker-mqttwarn
# install python libraries (TODO: any others?)
RUN pip install paho-mqtt requests
# build /opt/mqttwarn
RUN mkdir -p /opt/paradox
WORKDIR /opt/paradox
# add user mqttwarn to image
RUN groupadd -r paradox && useradd -r -g paradox paradox
RUN chown -R paradox /opt/paradox
# process run as mqttwarn user
USER paradox
# conf file from host
VOLUME ["/opt/paradox/conf"]
# set conf path
ENV PARADOXINI="/opt/paradox/conf/config.ini"
# finally, copy the current code (ideally we'd copy only what we need, but it
# is not clear what that is, yet)
COPY . /opt/paradox
# run process
CMD python IP150MQTTv2.py
Но если я запускаю тот же файл докера (с тем же файлом qemu) на моей машине с Ubuntu.
sudo docker build -f Docker/Dockerfile.arm32v7 .
Я получаю сборку. Так что, насколько я могу судить, процесс работает, но есть кое-что в среде докера-концентратора, на которой я застрял.