Message ID | 1468916208-18668-5-git-send-email-famz@redhat.com |
---|---|
State | Superseded |
Headers | show |
Fam Zheng <famz@redhat.com> writes: > From: Alex Bennée <alex.bennee@linaro.org> > > Together with the debian-bootstrap.pre script can now build an arbitrary > architecture of Debian using debootstrap. This allows debootstrap to set > up its first stage before the container is built. > > To build a container you need a command line like: > > DEB_ARCH=armhf DEB_TYPE=testing \ > ./tests/docker/docker.py build \ > --include-executable=arm-linux-user/qemu-arm debian:armhf \ > ./tests/docker/dockerfiles/debian-bootstrap.docker > > Although a number of non-debian systems package the debootstrap script > it is fairly portable in itself. Assuming we have some sort of fakeroot > implementation we can just clone the upstream repository and use the > script from there. > > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > Message-id: 1468335639-24582-5-git-send-email-alex.bennee@linaro.org Acked-by: Alex Bennée <alex.bennee@linaro.org> > --- > tests/docker/dockerfiles/debian-bootstrap.docker | 21 ++++++ > tests/docker/dockerfiles/debian-bootstrap.pre | 87 ++++++++++++++++++++++++ > 2 files changed, 108 insertions(+) > create mode 100644 tests/docker/dockerfiles/debian-bootstrap.docker > create mode 100755 tests/docker/dockerfiles/debian-bootstrap.pre > > diff --git a/tests/docker/dockerfiles/debian-bootstrap.docker b/tests/docker/dockerfiles/debian-bootstrap.docker > new file mode 100644 > index 0000000..3a9125e > --- /dev/null > +++ b/tests/docker/dockerfiles/debian-bootstrap.docker > @@ -0,0 +1,21 @@ > +# Create Debian Bootstrap Image > +# > +# This is intended to be pre-poluated by: > +# - a first stage debootstrap (see debian-bootstrap.pre) > +# - a native qemu-$arch that binfmt_misc will run > +FROM scratch > + > +# Add everything from the context into the container > +ADD . / > + > +# Patch all mounts as docker already has stuff set up > +RUN sed -i 's/in_target mount/echo not for docker in_target mount/g' /debootstrap/functions > + > +# Run stage 2 > +RUN /debootstrap/debootstrap --second-stage > + > +# At this point we can install additional packages if we want > +# Duplicate deb line as deb-src > +RUN cat /etc/apt/sources.list | sed "s/deb/deb-src/" >> /etc/apt/sources.list > +RUN apt-get update > +RUN apt-get -y build-dep qemu > diff --git a/tests/docker/dockerfiles/debian-bootstrap.pre b/tests/docker/dockerfiles/debian-bootstrap.pre > new file mode 100755 > index 0000000..55850be > --- /dev/null > +++ b/tests/docker/dockerfiles/debian-bootstrap.pre > @@ -0,0 +1,87 @@ > +#!/bin/sh > +# > +# Simple wrapper for debootstrap, run in the docker build context > +# > +FAKEROOT=`which fakeroot 2> /dev/null` > + > +exit_and_skip() > +{ > + exit 3 > +} > + > +# > +# fakeroot is needed to run the bootstrap stage > +# > +if [ -z $FAKEROOT ]; then > + echo "Please install fakeroot to enable bootstraping" > + exit_and_skip > +fi > + > +# We check in order for > +# > +# - DEBOOTSTRAP_DIR pointing at a development checkout > +# - PATH for the debootstrap script (installed) > +# > +# If neither option works then we checkout debootstrap from its > +# upstream SCM and run it from there. > +# > + > +if [ -z $DEBOOTSTRAP_DIR ]; then > + DEBOOTSTRAP=`which debootstrap 2> /dev/null` > + if [ -z $DEBOOTSTRAP ]; then > + echo "No debootstrap installed, attempting to install from SCM" > + DEBOOTSTRAP_SOURCE=https://anonscm.debian.org/git/d-i/debootstrap.git > + git clone ${DEBOOTSTRAP_SOURCE} ./debootstrap.git > + export DEBOOTSTRAP_DIR=./debootstrap.git > + DEBOOTSTRAP=./debootstrap.git/debootstrap > + fi > +else > + DEBOOTSTRAP=${DEBOOTSTRAP_DIR}/debootstrap > + if [ ! -f $DEBOOTSTRAP ]; then > + echo "Couldn't find script at ${DEBOOTSTRAP}" > + exit_and_skip > + fi > +fi > + > +# > +# Finally check to see if any qemu's are installed > +# > +BINFMT_DIR=/proc/sys/fs/binfmt_misc > +if [ ! -e $BINFMT_DIR ]; then > + echo "binfmt_misc needs enabling for a QEMU bootstrap to work" > + exit_and_skip > +else > + # DEB_ARCH and QEMU arch names are not totally aligned > + case "${DEB_ARCH}" in > + amd64) > + QEMU=qemu-i386 > + ;; > + armel|armhf) > + QEMU=qemu-arm > + ;; > + arm64) > + QEMU=qemu-aarch64 > + ;; > + powerpc) > + QEMU=qemu-ppc > + ;; > + ppc64el) > + QEMU=qemu-ppc64le > + ;; > + s390) > + QEMU=qemu-s390x > + ;; > + *) > + QEMU=qemu-${DEB_ARCH} > + ;; > + esac > + if [ ! -e "${BINFMT_DIR}/$QEMU" ]; then > + echo "No binfmt_misc rule to run $QEMU, can't bootstrap" > + exit_and_skip > + fi > +fi > + > +echo "Building a rootfs using ${FAKEROOT} and ${DEBOOTSTRAP}" > + > +${FAKEROOT} ${DEBOOTSTRAP} --variant=buildd --foreign --arch=$DEB_ARCH $DEB_TYPE . http://httpredir.debian.org/debian || exit 1 > +exit 0 -- Alex Bennée
diff --git a/tests/docker/dockerfiles/debian-bootstrap.docker b/tests/docker/dockerfiles/debian-bootstrap.docker new file mode 100644 index 0000000..3a9125e --- /dev/null +++ b/tests/docker/dockerfiles/debian-bootstrap.docker @@ -0,0 +1,21 @@ +# Create Debian Bootstrap Image +# +# This is intended to be pre-poluated by: +# - a first stage debootstrap (see debian-bootstrap.pre) +# - a native qemu-$arch that binfmt_misc will run +FROM scratch + +# Add everything from the context into the container +ADD . / + +# Patch all mounts as docker already has stuff set up +RUN sed -i 's/in_target mount/echo not for docker in_target mount/g' /debootstrap/functions + +# Run stage 2 +RUN /debootstrap/debootstrap --second-stage + +# At this point we can install additional packages if we want +# Duplicate deb line as deb-src +RUN cat /etc/apt/sources.list | sed "s/deb/deb-src/" >> /etc/apt/sources.list +RUN apt-get update +RUN apt-get -y build-dep qemu diff --git a/tests/docker/dockerfiles/debian-bootstrap.pre b/tests/docker/dockerfiles/debian-bootstrap.pre new file mode 100755 index 0000000..55850be --- /dev/null +++ b/tests/docker/dockerfiles/debian-bootstrap.pre @@ -0,0 +1,87 @@ +#!/bin/sh +# +# Simple wrapper for debootstrap, run in the docker build context +# +FAKEROOT=`which fakeroot 2> /dev/null` + +exit_and_skip() +{ + exit 3 +} + +# +# fakeroot is needed to run the bootstrap stage +# +if [ -z $FAKEROOT ]; then + echo "Please install fakeroot to enable bootstraping" + exit_and_skip +fi + +# We check in order for +# +# - DEBOOTSTRAP_DIR pointing at a development checkout +# - PATH for the debootstrap script (installed) +# +# If neither option works then we checkout debootstrap from its +# upstream SCM and run it from there. +# + +if [ -z $DEBOOTSTRAP_DIR ]; then + DEBOOTSTRAP=`which debootstrap 2> /dev/null` + if [ -z $DEBOOTSTRAP ]; then + echo "No debootstrap installed, attempting to install from SCM" + DEBOOTSTRAP_SOURCE=https://anonscm.debian.org/git/d-i/debootstrap.git + git clone ${DEBOOTSTRAP_SOURCE} ./debootstrap.git + export DEBOOTSTRAP_DIR=./debootstrap.git + DEBOOTSTRAP=./debootstrap.git/debootstrap + fi +else + DEBOOTSTRAP=${DEBOOTSTRAP_DIR}/debootstrap + if [ ! -f $DEBOOTSTRAP ]; then + echo "Couldn't find script at ${DEBOOTSTRAP}" + exit_and_skip + fi +fi + +# +# Finally check to see if any qemu's are installed +# +BINFMT_DIR=/proc/sys/fs/binfmt_misc +if [ ! -e $BINFMT_DIR ]; then + echo "binfmt_misc needs enabling for a QEMU bootstrap to work" + exit_and_skip +else + # DEB_ARCH and QEMU arch names are not totally aligned + case "${DEB_ARCH}" in + amd64) + QEMU=qemu-i386 + ;; + armel|armhf) + QEMU=qemu-arm + ;; + arm64) + QEMU=qemu-aarch64 + ;; + powerpc) + QEMU=qemu-ppc + ;; + ppc64el) + QEMU=qemu-ppc64le + ;; + s390) + QEMU=qemu-s390x + ;; + *) + QEMU=qemu-${DEB_ARCH} + ;; + esac + if [ ! -e "${BINFMT_DIR}/$QEMU" ]; then + echo "No binfmt_misc rule to run $QEMU, can't bootstrap" + exit_and_skip + fi +fi + +echo "Building a rootfs using ${FAKEROOT} and ${DEBOOTSTRAP}" + +${FAKEROOT} ${DEBOOTSTRAP} --variant=buildd --foreign --arch=$DEB_ARCH $DEB_TYPE . http://httpredir.debian.org/debian || exit 1 +exit 0