#!/bin/sh # # Simple wrapper for debootstrap, run in the docker build context # FAKEROOT=$(which fakeroot 2> /dev/null) # debootstrap < 1.0.67 generates empty sources.list, see Debian#732255 MIN_DEBOOTSTRAP_VERSION=1.0.67 exit_and_skip() { exit 3 } # # fakeroot is needed to run the bootstrap stage # if [ -z $FAKEROOT ]; then echo "Please install fakeroot to enable bootstraping" >&2 exit_and_skip fi if [ -z "${DEB_ARCH}" ]; then echo "Please set DEB_ARCH to choose an architecture (e.g. armhf)" >&2 exit_and_skip fi if [ -z "${DEB_TYPE}" ]; then echo "Please set DEB_TYPE to a Debian archive name (e.g. testing)" >&2 exit_and_skip fi # The following allow finer grain control over the defaults if [ -z "${DEB_VARIANT}" ]; then DEB_VARIANT=buildd fi if [ -z "${DEB_URL}" ]; then DEB_URL="http://httpredir.debian.org/debian" 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 NEED_DEBOOTSTRAP=false DEBOOTSTRAP=$(which debootstrap 2> /dev/null) if [ -z $DEBOOTSTRAP ]; then echo "No debootstrap installed, attempting to install from SCM" NEED_DEBOOTSTRAP=true else INSTALLED_VERSION=$(${DEBOOTSTRAP} --version | sed 's/debootstrap \([0-9\.]*\)[^0-9\.]*.*/\1/') if ! (echo "${MIN_DEBOOTSTRAP_VERSION}" ; echo "${INSTALLED_VERSION}") \ | sort -t . -n -k 1,1 -k 2,2 -k 3,3 -C ; then echo "debootstrap too old, attempting to install from SCM" NEED_DEBOOTSTRAP=true fi fi if $NEED_DEBOOTSTRAP; then DEBOOTSTRAP_SOURCE=https://salsa.debian.org/installer-team/debootstrap.git git clone ${DEBOOTSTRAP_SOURCE} ./debootstrap.git export DEBOOTSTRAP_DIR=./debootstrap.git DEBOOTSTRAP=./debootstrap.git/debootstrap (cd "${DEBOOTSTRAP_DIR}" && "${FAKEROOT}" make ) fi else DEBOOTSTRAP=${DEBOOTSTRAP_DIR}/debootstrap if [ ! -f $DEBOOTSTRAP ]; then echo "Couldn't find script at ${DEBOOTSTRAP}" >&2 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" >&2 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" >&2 exit_and_skip fi fi echo "Building a rootfs using ${FAKEROOT} and ${DEBOOTSTRAP} ${DEB_ARCH}/${DEB_TYPE}" ${FAKEROOT} ${DEBOOTSTRAP} --variant=$DEB_VARIANT --foreign --arch=$DEB_ARCH $DEB_TYPE . $DEB_URL || exit 1 exit 0