On 10/29/2026 10:39 AM, Fabiano Rosas wrote:
> Pierrick Bouvier <[email protected]> writes:
> 
>> On 10/29/2026 6:41 AM, Fabiano Rosas wrote:
>>> 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
>>>>
>>>> Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
>>>> Reviewed-by: Fabiano Rosas <[email protected]>
>>>> 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/* && \
>>>
>>> For the record, here I included a 'cp <list of bins> /opt/qemu/bin' line
>>> to make migration-test work from inside the container:
>>>
>>> migration-test
>>> sh
>>> env
>>> docker (installed as docker.io up there)
>>> cat
>>>
>>
>> You mean by mounting current folder in the container?
>>
> 
> I mean having the test binary present in the container as well.
> 
> This is something specific to migration compat testing: to avoid having
> issues due to features mismatches, we run the older version of
> migration-test when testing two different QEMU versions.
> 
> But then...
> $ git checkout <old tag>
> $ make check-build
> $ ./migration-test <QEMU old container> <QEMU new container>
> 
> is kind of wasteful. I can simply build a container with QEMU +
> migration-test already in it and invoke:
> 
> $ ./<migration-test old container> <QEMU old container> <QEMU new container>
>

Ok, I see. I'm not very familiar with migration testing, and assumed the
logic was opposite (that migration-test is backward compatible to test
from old versions).

But migration-test is not included in old container, since it's a test
binary (thus not installed). I feel that for this case, you need to
build from sources, at least to get migration-test-old.

>> I'm not against it, but I feel that if we go this way, it's just easier
>> to say "let's use the full base image", since it will become "I need to
>> run python, and X, and Y, and Z".
>>
> 
> I think we should merge this series as is. However if we intend to use
> it in the future for something more complex, something like the above
> will probably come up. Anyway, I posted literally "for the record".
>

Sure, I'm just interested to make something useful for you. If it's half
baked, there is little value in merging this.

Regards,
Pierrick

Reply via email to