PYNQ v2.7.0 image build in Docker

Hi there,

In an older post it was mentioned that the PYNQ team “use containers inside [their] Jenkins flows for automated building of SD Card images” so I thought I would try to do the same.

Previously I ported the PYNQ v2.7.0 image to a custom Zynq US+ building inside an Ubuntu 18.04 VM created using the provided Vagrant file. Now I am trying to move the build process inside a Docker image where I mount my local AMD Xilinx 2020.2 tools.

I can build Overlays inside Docker, however, when I try to build the PYNQ image I get this error when installing XRT:

+ '[' -e /workspace/PYNQ/sdbuild/packages/xrt/qemu.sh ']'
+ cp /workspace/PYNQ/sdbuild/packages/xrt/qemu.sh /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1
+ sudo -E chroot /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1 bash qemu.sh
chroot: failed to run command ‘bash’: Exec format error

This is the content of my Dockerfile to build the Image on Jenkins. It is inspired by this pull request for PYNQ 3.0.1, downgraded to Ubuntu 18.04.6 LTS for PYNQ 2.7.0.

FROM docker.io/ubuntu:18.04

USER root

RUN dpkg --add-architecture i386
RUN apt update && apt upgrade -y --force-yes && \
    DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get install -y \
    software-properties-common lsb-core cmake wget sudo git \
    subversion locales cpio nano \
    libxtst6 libx11-6 libtinfo-dev libxrender-dev libfreetype6 libxi6 \
    libncurses5  xterm \
    libncurses5-dev libncursesw5-dev \
    autoconf libtool \
    texinfo gcc-multilib

# Setup host for PYNQ - using file from master branch to get updates for old links
WORKDIR /tmp/work
RUN wget https://raw.githubusercontent.com/Xilinx/PYNQ/refs/heads/master/sdbuild/scripts/setup_host.sh
RUN chmod +x setup_host.sh
RUN bash -c "source /tmp/work/setup_host.sh"
RUN rm -r /tmp/work/*

ENV PATH /opt/qemu/bin:/opt/crosstool-ng/bin:$PATH

RUN echo "dash dash/sh boolean false" | debconf-set-selections
RUN DEBIAN_FRONTEND=noninteractive dpkg-reconfigure dash

WORKDIR /workspace

# Preload libudev for Vivado when running in Docker
ENV LD_PRELOAD /lib/x86_64-linux-gnu/libudev.so.1:$LD_PRELOAD

# Extra config for petalinux
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

RUN groupadd -g 1001 jenkins
RUN useradd -u 1001 -g 1001 -ms /bin/bash jenkins
RUN usermod -aG sudo jenkins
RUN echo '%jenkins ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
RUN chown jenkins:jenkins /workspace
USER jenkins

Has anyone encountered this issue or know what could be the cause of this?

Any help would be highly appreciated!

Many thanks,
Mario

We have a docker flow coming in PYNQ v3.1 … but just looking at the script did you mount the needed paths to run inside chroot … I typically do these mounts before chroot’ing in

# Mount required directories
sudo mount -o bind /proc "$CHROOT_PATH/proc"
sudo mount -o bind /dev "$CHROOT_PATH/dev"
sudo mount -o bind /run "$CHROOT_PATH/run"

That’s great to hear, I look forward to seeing how the official Dockerfile is set up!

The mounting of /proc, /dev and /run happen automatically during the build flow, I can see the mounting and unmounting happen in the build log:

...

[INFO] Successfully built kernel-devsrc
cp -f /workspace/PYNQ/sdbuild/build/ADM-XRC-9Z1/petalinux_project/build/tmp/deploy/rpm/*/kernel-devsrc-1.0-r0.*.rpm /workspace/PYNQ/sdbuild/build/ADM-XRC-9Z1/petalinux_project/build/tmp/deploy/rpm/kernel-devsrc-1.0-r0.plnx_aarch64.rpm
mkdir -p /workspace/PYNQ/sdbuild/ccache
sudo rm -fr /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1
mkdir /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1
(cd /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1 && sudo tar -xf /workspace/PYNQ/sdbuild/prebuilt/pynq_aarch64_2_7)
QEMU_EXE=/opt/qemu/bin/qemu-aarch64-static PYNQ_BOARDDIR=/workspace/boards/ADM-XRC-9Z1 PYNQ_BOARD=ADM-XRC-9Z1 FPGA_MANAGER=1 ARCH=aarch64 PACKAGE_PATH=/workspace/boards/ADM-XRC-9Z1/packages /workspace/PYNQ/sdbuild/scripts/install_packages.sh /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1 xrt pynq ethernet sensorconf pynq_peripherals
+ target=/workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1
+ shift
+ fss='proc run dev'
+ for fs in $fss
+ sudo mount -o bind /proc /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1/proc
+ for fs in $fss
+ sudo mount -o bind /run /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1/run
+ for fs in $fss
+ sudo mount -o bind /dev /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1/dev
+ mkdir -p /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1/ccache
+ sudo mount -o bind /workspace/PYNQ/sdbuild/ccache /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1/ccache
+ trap unmount_special EXIT

...

[INFO] Successfully built zocl
+ sudo cp -rf /workspace/PYNQ/sdbuild/build/ADM-XRC-9Z1/petalinux_project/build/tmp/sysroots-components/zynqmp_generic/zocl/usr /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1
+ sudo cp -rf /workspace/PYNQ/sdbuild/build/ADM-XRC-9Z1/petalinux_project/build/tmp/sysroots-components/zynqmp_generic/zocl/lib /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1
+ '[' -e /workspace/PYNQ/sdbuild/packages/xrt/qemu.sh ']'
+ cp /workspace/PYNQ/sdbuild/packages/xrt/qemu.sh /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1
+ sudo -E chroot /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1 bash qemu.sh
chroot: failed to run command ‘bash’: Exec format error
+ unmount_special
+ for fs in $fss
+ sudo umount -l /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1/proc
+ for fs in $fss
+ sudo umount -l /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1/run
+ for fs in $fss
+ sudo umount -l /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1/dev
+ sudo umount -l /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1/ccache
+ rmdir /workspace/PYNQ/sdbuild/build/focal.ADM-XRC-9Z1/ccache
Makefile:343: recipe for target '/workspace/PYNQ/sdbuild/build/ADM-XRC-9Z1.tar.gz' failed
make[1]: *** [/workspace/PYNQ/sdbuild/build/ADM-XRC-9Z1.tar.gz] Error 126
make[1]: Leaving directory '/workspace/PYNQ/sdbuild'

When looking into the Exec format error I found mentions of missing shebang #!/bin/bash for the executed script (qemu.sh) which shouldn’t be an issue anyway as it is directly executed with bash. I tried patching it in and got the same error.