diff mbox

[RFC,v4,4/4] docker: Add debootstrap-arm image

Message ID 1468207242-5015-5-git-send-email-famz@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Fam Zheng July 11, 2016, 3:20 a.m. UTC
Signed-off-by: Fam Zheng <famz@redhat.com>
---
 tests/docker/dockerfiles/debootstrap-arm.docker | 35 +++++++++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 tests/docker/dockerfiles/debootstrap-arm.docker

Comments

Alex Bennée July 11, 2016, 7:06 p.m. UTC | #1
Fam Zheng <famz@redhat.com> writes:

> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  tests/docker/dockerfiles/debootstrap-arm.docker | 35 +++++++++++++++++++++++++
>  1 file changed, 35 insertions(+)
>  create mode 100644 tests/docker/dockerfiles/debootstrap-arm.docker
>
> diff --git a/tests/docker/dockerfiles/debootstrap-arm.docker b/tests/docker/dockerfiles/debootstrap-arm.docker
> new file mode 100644
> index 0000000..cb15f2f
> --- /dev/null
> +++ b/tests/docker/dockerfiles/debootstrap-arm.docker
> @@ -0,0 +1,35 @@
> +FROM debian:testing
> +
> +RUN apt-get update
> +RUN apt-get install -y fakeroot debootstrap qemu-user-static
> +
> +RUN mkdir /debootstrap-arm
> +
> +RUN cd /debootstrap-arm && fakeroot debootstrap --variant=buildd --foreign \
> +    --arch=armhf testing . http://httpredir.debian.org/debian
> +
> +RUN sed -i 's/in_target mount/echo not for docker in_target mount/g' \
> +    /debootstrap-arm/debootstrap/functions
> +
> +RUN mkdir -p /debootstrap-arm/usr/local/bin
> +
> +RUN ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/bin/qemu-arm && \
> +    ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/bin/qemu-arm-static && \
> +    ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/local/bin/qemu-arm && \
> +    ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/local/bin/qemu-arm-static
> +
> +# Run stage 2
> +RUN if ! chroot /debootstrap-arm /debootstrap/debootstrap --second-stage; then \
> +        echo "Failed to chroot and do stage 2"; \
> +        echo "Please set up binfmt_misc to point arm binary to one of:"; \
> +        echo "  /usr/bin/qemu-arm"; \
> +        echo "  /usr/bin/qemu-arm-static"; \
> +        echo "  /usr/local/bin/qemu-arm"; \
> +        echo "  /usr/local/bin/qemu-arm-static"; \
> +        exit 1; \
> +    fi
> +RUN chroot /debootstrap-arm sh -c 'cat /etc/apt/sources.list | sed "s/deb/deb-src/" >> /etc/apt/sources.list'
> +RUN chroot /debootstrap-arm apt-get update
> +RUN chroot /debootstrap-arm apt-get build-dep -y qemu
> +RUN chroot /debootstrap-arm apt-get install -y ccache
> +ENV QEMU_CHROOT /debootstrap-arm

OK I've done some more experimenting and two things are apparent:

  debootstrap is widely packaged for various distros

And

  The script it fairly portable so we can always run it directly

I hacked up the .pre script to do the following and tested on my Arch
VM:

#!/bin/sh
#
# Simple wrapper for debootstrap, run in the docker build context
#
FAKEROOT=`which fakeroot 2> /dev/null`
DEBOOTSTRAP=`which debootstrap 2> /dev/null`
DEBOOTSTRAP_SOURCE=https://anonscm.debian.org/git/d-i/debootstrap.git

if [ -z $FAKEROOT ]; then
    echo "Please install fakeroot to enable bootstraping"
    exit 1
fi

if [ -z $DEBOOTSTRAP ]; then
    echo "No debootstrap installed, attempting to install from SCM"
    git clone ${DEBOOTSTRAP_SOURCE} ./debootstrap.git
    export DEBOOTSTRAP_DIR=./debootstrap.git
    DEBOOTSTRAP=./debootstrap.git/debootstrap
fi

echo "Building a rootfs using ${FAKEROOT} and ${DEBOOTSTRAP}"

${FAKEROOT} /bin/sh -x ${DEBOOTSTRAP} --variant=buildd --foreign --arch=$DEB_ARCH $DEB_TYPE . http://httpredir.debian.org/debian
exit 0

So I think it is feasible to but the pre-requisite checking and work
around in the pre script and be done with it. It seems neater than the
chroot within a container approach.

Thoughts?

--
Alex Bennée
Fam Zheng July 12, 2016, 1:40 a.m. UTC | #2
On Mon, 07/11 20:06, Alex Bennée wrote:
> 
> Fam Zheng <famz@redhat.com> writes:
> 
> > Signed-off-by: Fam Zheng <famz@redhat.com>
> > ---
> >  tests/docker/dockerfiles/debootstrap-arm.docker | 35 +++++++++++++++++++++++++
> >  1 file changed, 35 insertions(+)
> >  create mode 100644 tests/docker/dockerfiles/debootstrap-arm.docker
> >
> > diff --git a/tests/docker/dockerfiles/debootstrap-arm.docker b/tests/docker/dockerfiles/debootstrap-arm.docker
> > new file mode 100644
> > index 0000000..cb15f2f
> > --- /dev/null
> > +++ b/tests/docker/dockerfiles/debootstrap-arm.docker
> > @@ -0,0 +1,35 @@
> > +FROM debian:testing
> > +
> > +RUN apt-get update
> > +RUN apt-get install -y fakeroot debootstrap qemu-user-static
> > +
> > +RUN mkdir /debootstrap-arm
> > +
> > +RUN cd /debootstrap-arm && fakeroot debootstrap --variant=buildd --foreign \
> > +    --arch=armhf testing . http://httpredir.debian.org/debian
> > +
> > +RUN sed -i 's/in_target mount/echo not for docker in_target mount/g' \
> > +    /debootstrap-arm/debootstrap/functions
> > +
> > +RUN mkdir -p /debootstrap-arm/usr/local/bin
> > +
> > +RUN ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/bin/qemu-arm && \
> > +    ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/bin/qemu-arm-static && \
> > +    ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/local/bin/qemu-arm && \
> > +    ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/local/bin/qemu-arm-static
> > +
> > +# Run stage 2
> > +RUN if ! chroot /debootstrap-arm /debootstrap/debootstrap --second-stage; then \
> > +        echo "Failed to chroot and do stage 2"; \
> > +        echo "Please set up binfmt_misc to point arm binary to one of:"; \
> > +        echo "  /usr/bin/qemu-arm"; \
> > +        echo "  /usr/bin/qemu-arm-static"; \
> > +        echo "  /usr/local/bin/qemu-arm"; \
> > +        echo "  /usr/local/bin/qemu-arm-static"; \
> > +        exit 1; \
> > +    fi
> > +RUN chroot /debootstrap-arm sh -c 'cat /etc/apt/sources.list | sed "s/deb/deb-src/" >> /etc/apt/sources.list'
> > +RUN chroot /debootstrap-arm apt-get update
> > +RUN chroot /debootstrap-arm apt-get build-dep -y qemu
> > +RUN chroot /debootstrap-arm apt-get install -y ccache
> > +ENV QEMU_CHROOT /debootstrap-arm
> 
> OK I've done some more experimenting and two things are apparent:
> 
>   debootstrap is widely packaged for various distros
> 
> And
> 
>   The script it fairly portable so we can always run it directly
> 
> I hacked up the .pre script to do the following and tested on my Arch
> VM:
> 
> #!/bin/sh
> #
> # Simple wrapper for debootstrap, run in the docker build context
> #
> FAKEROOT=`which fakeroot 2> /dev/null`
> DEBOOTSTRAP=`which debootstrap 2> /dev/null`
> DEBOOTSTRAP_SOURCE=https://anonscm.debian.org/git/d-i/debootstrap.git
> 
> if [ -z $FAKEROOT ]; then
>     echo "Please install fakeroot to enable bootstraping"
>     exit 1
> fi
> 
> if [ -z $DEBOOTSTRAP ]; then
>     echo "No debootstrap installed, attempting to install from SCM"
>     git clone ${DEBOOTSTRAP_SOURCE} ./debootstrap.git
>     export DEBOOTSTRAP_DIR=./debootstrap.git
>     DEBOOTSTRAP=./debootstrap.git/debootstrap
> fi
> 
> echo "Building a rootfs using ${FAKEROOT} and ${DEBOOTSTRAP}"
> 
> ${FAKEROOT} /bin/sh -x ${DEBOOTSTRAP} --variant=buildd --foreign --arch=$DEB_ARCH $DEB_TYPE . http://httpredir.debian.org/debian
> exit 0
> 
> So I think it is feasible to but the pre-requisite checking and work
> around in the pre script and be done with it. It seems neater than the
> chroot within a container approach.
> 
> Thoughts?

Yes, makes sense to me.  Two more questions:

Can we have "make docker-images" to update the docker image if pre script has
been updated?

Can we skip debootstrap (i.e. skip .pre script) if it's only the dockerfile
that has changed?

Thanks,

Fam
Alex Bennée July 12, 2016, 2:16 p.m. UTC | #3
Fam Zheng <famz@redhat.com> writes:

> On Mon, 07/11 20:06, Alex Bennée wrote:
>>
>> Fam Zheng <famz@redhat.com> writes:
>>
>> > Signed-off-by: Fam Zheng <famz@redhat.com>
>> > ---
>> >  tests/docker/dockerfiles/debootstrap-arm.docker | 35 +++++++++++++++++++++++++
>> >  1 file changed, 35 insertions(+)
>> >  create mode 100644 tests/docker/dockerfiles/debootstrap-arm.docker
>> >
>> > diff --git a/tests/docker/dockerfiles/debootstrap-arm.docker b/tests/docker/dockerfiles/debootstrap-arm.docker
>> > new file mode 100644
>> > index 0000000..cb15f2f
>> > --- /dev/null
>> > +++ b/tests/docker/dockerfiles/debootstrap-arm.docker
>> > @@ -0,0 +1,35 @@
>> > +FROM debian:testing
>> > +
>> > +RUN apt-get update
>> > +RUN apt-get install -y fakeroot debootstrap qemu-user-static
>> > +
>> > +RUN mkdir /debootstrap-arm
>> > +
>> > +RUN cd /debootstrap-arm && fakeroot debootstrap --variant=buildd --foreign \
>> > +    --arch=armhf testing . http://httpredir.debian.org/debian
>> > +
>> > +RUN sed -i 's/in_target mount/echo not for docker in_target mount/g' \
>> > +    /debootstrap-arm/debootstrap/functions
>> > +
>> > +RUN mkdir -p /debootstrap-arm/usr/local/bin
>> > +
>> > +RUN ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/bin/qemu-arm && \
>> > +    ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/bin/qemu-arm-static && \
>> > +    ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/local/bin/qemu-arm && \
>> > +    ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/local/bin/qemu-arm-static
>> > +
>> > +# Run stage 2
>> > +RUN if ! chroot /debootstrap-arm /debootstrap/debootstrap --second-stage; then \
>> > +        echo "Failed to chroot and do stage 2"; \
>> > +        echo "Please set up binfmt_misc to point arm binary to one of:"; \
>> > +        echo "  /usr/bin/qemu-arm"; \
>> > +        echo "  /usr/bin/qemu-arm-static"; \
>> > +        echo "  /usr/local/bin/qemu-arm"; \
>> > +        echo "  /usr/local/bin/qemu-arm-static"; \
>> > +        exit 1; \
>> > +    fi
>> > +RUN chroot /debootstrap-arm sh -c 'cat /etc/apt/sources.list | sed "s/deb/deb-src/" >> /etc/apt/sources.list'
>> > +RUN chroot /debootstrap-arm apt-get update
>> > +RUN chroot /debootstrap-arm apt-get build-dep -y qemu
>> > +RUN chroot /debootstrap-arm apt-get install -y ccache
>> > +ENV QEMU_CHROOT /debootstrap-arm
>>
>> OK I've done some more experimenting and two things are apparent:
>>
>>   debootstrap is widely packaged for various distros
>>
>> And
>>
>>   The script it fairly portable so we can always run it directly
>>
>> I hacked up the .pre script to do the following and tested on my Arch
>> VM:
>>
>> #!/bin/sh
>> #
>> # Simple wrapper for debootstrap, run in the docker build context
>> #
>> FAKEROOT=`which fakeroot 2> /dev/null`
>> DEBOOTSTRAP=`which debootstrap 2> /dev/null`
>> DEBOOTSTRAP_SOURCE=https://anonscm.debian.org/git/d-i/debootstrap.git
>>
>> if [ -z $FAKEROOT ]; then
>>     echo "Please install fakeroot to enable bootstraping"
>>     exit 1
>> fi
>>
>> if [ -z $DEBOOTSTRAP ]; then
>>     echo "No debootstrap installed, attempting to install from SCM"
>>     git clone ${DEBOOTSTRAP_SOURCE} ./debootstrap.git
>>     export DEBOOTSTRAP_DIR=./debootstrap.git
>>     DEBOOTSTRAP=./debootstrap.git/debootstrap
>> fi
>>
>> echo "Building a rootfs using ${FAKEROOT} and ${DEBOOTSTRAP}"
>>
>> ${FAKEROOT} /bin/sh -x ${DEBOOTSTRAP} --variant=buildd --foreign --arch=$DEB_ARCH $DEB_TYPE . http://httpredir.debian.org/debian
>> exit 0
>>
>> So I think it is feasible to but the pre-requisite checking and work
>> around in the pre script and be done with it. It seems neater than the
>> chroot within a container approach.
>>
>> Thoughts?
>
> Yes, makes sense to me.  Two more questions:
>
> Can we have "make docker-images" to update the docker image if pre script has
> been updated?

We could, I'm not sure what the dependency should be for a file that may
or may not exist?

The larger problem is what to do about the fact that debootstrap is a
multi-arch script? Currently I can manually build the
qmu:debian-bootstrap image from the command line for any linux-user
architecture.

Once this is done I can then run all the tests under that single
emulated architecture. The question is should the "make docker" expand
debian-bootstrap into all the various architecture targets and build
them all or just assume what ever one is set-up by the user is the one
that gets tested?

Currently:

  make docker-image-debian-bootstrap DEB_ARCH=arm64 DEB_TYPE=testing V=1 J=9

Will fail because the build machinery doesn't know what
--include-executable to pass to the docker.py script.

However after that everything should work.

My current state is at:

   https://github.com/stsquad/qemu/tree/misc/docker-linux-user-v4

I'll post v5 shortly after I've done some basic testing.

>
> Can we skip debootstrap (i.e. skip .pre script) if it's only the dockerfile
> that has changed?

No, because a running a dockerfile implies re-building the container
from scratch and the .pre script needs to pre-seed the build context.

>
> Thanks,
>
> Fam


--
Alex Bennée
diff mbox

Patch

diff --git a/tests/docker/dockerfiles/debootstrap-arm.docker b/tests/docker/dockerfiles/debootstrap-arm.docker
new file mode 100644
index 0000000..cb15f2f
--- /dev/null
+++ b/tests/docker/dockerfiles/debootstrap-arm.docker
@@ -0,0 +1,35 @@ 
+FROM debian:testing
+
+RUN apt-get update
+RUN apt-get install -y fakeroot debootstrap qemu-user-static
+
+RUN mkdir /debootstrap-arm
+
+RUN cd /debootstrap-arm && fakeroot debootstrap --variant=buildd --foreign \
+    --arch=armhf testing . http://httpredir.debian.org/debian
+
+RUN sed -i 's/in_target mount/echo not for docker in_target mount/g' \
+    /debootstrap-arm/debootstrap/functions
+
+RUN mkdir -p /debootstrap-arm/usr/local/bin
+
+RUN ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/bin/qemu-arm && \
+    ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/bin/qemu-arm-static && \
+    ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/local/bin/qemu-arm && \
+    ln /usr/bin/qemu-arm-static /debootstrap-arm/usr/local/bin/qemu-arm-static
+
+# Run stage 2
+RUN if ! chroot /debootstrap-arm /debootstrap/debootstrap --second-stage; then \
+        echo "Failed to chroot and do stage 2"; \
+        echo "Please set up binfmt_misc to point arm binary to one of:"; \
+        echo "  /usr/bin/qemu-arm"; \
+        echo "  /usr/bin/qemu-arm-static"; \
+        echo "  /usr/local/bin/qemu-arm"; \
+        echo "  /usr/local/bin/qemu-arm-static"; \
+        exit 1; \
+    fi
+RUN chroot /debootstrap-arm sh -c 'cat /etc/apt/sources.list | sed "s/deb/deb-src/" >> /etc/apt/sources.list'
+RUN chroot /debootstrap-arm apt-get update
+RUN chroot /debootstrap-arm apt-get build-dep -y qemu
+RUN chroot /debootstrap-arm apt-get install -y ccache
+ENV QEMU_CHROOT /debootstrap-arm