| #!/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 | |
| # | |
| # Add optional args | |
| # | |
| if [ -n "${DEB_KEYRING}" ]; then | |
| DEBOOTSTRAP="${DEBOOTSTRAP} --keyring=${DEB_KEYRING}" | |
| 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 |