Pierrick Bouvier <[email protected]> writes: > This new dockerfile allows to build a distroless image containing only > qemu stripped release binaries, their lib dependencies, and installed > artifacts (roms, keymap, ...). There is no shell, no python, nothing > else. This is achieved thanks to a multi-stage build, where we add qemu > binaries, artifacts and libraries in a new scratch image. Image has > the minimal size possible. > > This is based on Ubuntu, which has the advantage to have working > containers available down to 14.04. Debian old old stable have broken > apt sources for instance. > > This unique dockerfile works for all qemu versions >= 3.1.0 (2018). > We could build down to v0.12.0, but it would require more tweaks in the > dockerfile, so we keep it simple instead. > > To build the image, you need to provide a qemu and ubuntu version: > $ podman build -f release.Dockerfile --build-arg QEMU_VERSION=v11.1.0 > --build-arg UBUNTU_VERSION=24.04 -t qemu/v11.1.0 > > To run it, as there is no shell, and no defined entrypoint, you need to > choose the binary you want explicitely: > $ podman run -it --rm qemu/v11.1.0 qemu-system-aarch64 --version > > Signed-off-by: Pierrick Bouvier <[email protected]> > --- > tests/docker/dockerfiles/release.docker | 48 +++++++++++++++++++++++++ > 1 file changed, 48 insertions(+) > create mode 100644 tests/docker/dockerfiles/release.docker > > diff --git a/tests/docker/dockerfiles/release.docker > b/tests/docker/dockerfiles/release.docker > new file mode 100644 > index 00000000000..ca6babde01e > --- /dev/null > +++ b/tests/docker/dockerfiles/release.docker > @@ -0,0 +1,48 @@ > +ARG UBUNTU_VERSION="UBUNTU_VERSION_build_arg_must_be_set" > + > +FROM ubuntu:$UBUNTU_VERSION AS build > + > +# add deb-src for apt build-dep > +RUN sed -e 's/Types: deb/Types: deb deb-src/' -i /etc/apt/sources.list.d/* > || true > +RUN sed -e 's/# deb-src/deb-src/' -i /etc/apt/sources.list > +# archive.canonical.com is not reachable anymore, and cause a long timeout > +RUN sed -e '/archive.canonical.com/d' -i /etc/apt/sources.list > + > +# build dependencies > +RUN apt update && \ > +env DEBIAN_FRONTEND=noninteractive apt install -y git build-essential flex > bison > +RUN apt update && \ > +env DEBIAN_FRONTEND=noninteractive apt build-dep -y --arch-only qemu > + > +ARG QEMU_VERSION > +RUN echo "QEMU_VERSION=${QEMU_VERSION:?QEMU_VERSION build arg must be set}" > +ARG QEMU_REPO="https://gitlab.com/qemu-project/qemu.git" > + > +RUN cd /tmp && \ > +mkdir qemu && cd qemu && git init && \ > +git remote add origin "${QEMU_REPO}" && \ > +git fetch origin "${QEMU_VERSION}" --depth 1 && \ > +git checkout FETCH_HEAD && \ > +./configure --prefix=/opt/qemu --disable-docs --disable-werror && \ > +make install -j $(nproc) && \ > +strip /opt/qemu/bin/* && \ > +rm -rf /tmp/* > + > +# retrieve runtime dependencies (libs) > +RUN ldd /opt/qemu/bin/* | grep '=>' | sed -e 's/.*=>//' -e 's/(.*//' | sort > -u > /opt/qemu/libs > +# store them in /deps/lib > +RUN mkdir -p /deps/lib && cp --preserve --dereference $(cat /opt/qemu/libs) > /deps/lib > +# copy loader (with its original path) > +RUN cp --preserve --parents --dereference /lib*/ld-linux* /deps/ > + > +################################################################################ > +FROM scratch > + > +COPY --from=build /deps / > +# copy qemu and all associated artifacts (roms, ...) > +COPY --from=build /opt/qemu /usr > + > +# build with: > +# podman build -f release.docker --build-arg QEMU_VERSION=v11.1.0 > --build-arg UBUNTU_VERSION=24.04 -t qemu/v11.1.0 > +# run with: > +# podman run -it --rm qemu/v11.1.0 qemu-system-aarch64 --version
Reviewed-by: Fabiano Rosas <[email protected]>
