From 0460a745e355158559c01b25f8138404f21b5d92 Mon Sep 17 00:00:00 2001 From: Geoff Levand Date: Tue, 1 May 2018 12:41:10 -0700 Subject: [PATCH] docker: Add build container files Add dockerfiles and helper scripts that create a docker image with the tools needed to build petitboot. See the docker/README.md file for more info. Signed-off-by: Geoff Levand Signed-off-by: Samuel Mendoza-Jonas --- docker/Dockerfile.builder.amd64 | 24 ++++++++ docker/Dockerfile.builder.arm64 | 24 ++++++++ docker/README.md | 29 +++++++++ docker/build-builder | 104 ++++++++++++++++++++++++++++++++ docker/build-pb | 104 ++++++++++++++++++++++++++++++++ docker/builder-include | 43 +++++++++++++ 6 files changed, 328 insertions(+) create mode 100644 docker/Dockerfile.builder.amd64 create mode 100644 docker/Dockerfile.builder.arm64 create mode 100644 docker/README.md create mode 100755 docker/build-builder create mode 100755 docker/build-pb create mode 100644 docker/builder-include diff --git a/docker/Dockerfile.builder.amd64 b/docker/Dockerfile.builder.amd64 new file mode 100644 index 0000000..dc0cce4 --- /dev/null +++ b/docker/Dockerfile.builder.amd64 @@ -0,0 +1,24 @@ +# Image for compiling petitboot. + +FROM ubuntu:17.10 + +ENV LANG C.UTF-8 +ENV LC_ALL C.UTF-8 + +RUN apt-get update && apt-get install -y \ + apt-utils \ + autoconf \ + autopoint \ + bison \ + flex \ + gettext \ + gcc \ + git \ + libtool \ + libuv-dev \ + libdevmapper-dev \ + libncurses-dev \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +CMD /bin/bash diff --git a/docker/Dockerfile.builder.arm64 b/docker/Dockerfile.builder.arm64 new file mode 100644 index 0000000..d46581f --- /dev/null +++ b/docker/Dockerfile.builder.arm64 @@ -0,0 +1,24 @@ +# Image for compiling petitboot. + +FROM arm64v8/ubuntu:17.10 + +ENV LANG C.UTF-8 +ENV LC_ALL C.UTF-8 + +RUN apt-get update && apt-get install -y \ + apt-utils \ + autoconf \ + autopoint \ + bison \ + flex \ + gettext \ + gcc \ + git \ + libtool \ + libuv-dev \ + libdevmapper-dev \ + libncurses-dev \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +CMD /bin/bash diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000..7e3966d --- /dev/null +++ b/docker/README.md @@ -0,0 +1,29 @@ +# Petitboot Build Container Support + +## Command Summary + + - `build-builder` Builds a docker image that contains tools for building petitboot. Default docker image tag is `pb-builder:${VERSION}${ARCH_TAG}`. + - `build-pb` Builds the petitboot programs using a pb-builder container. + +## Examples + +### Build the petitboot programs + + ./build-builder -v + ./build-pb -vc + +### Run petitboot programs in a pb-builder container + + docker run --rm -v $(pwd):/opt/pb -w /opt/pb $(./docker/build-pb -t) ./ui/ncurses/petitboot-nc --help + +## Debugging Build Problems + +### Run an interactive pb-builder container + +As current user: + + docker run --rm -it --user $(id -u):$(id -g) -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro -v $(pwd):/opt/pb -w /opt/pb $(./docker/build-pb -t) bash + +As root: + + docker run --rm -it -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro -v $(pwd):/opt/pb -w /opt/pb $(./docker/build-pb -t) bash diff --git a/docker/build-builder b/docker/build-builder new file mode 100755 index 0000000..8a5015c --- /dev/null +++ b/docker/build-builder @@ -0,0 +1,104 @@ +#!/usr/bin/env bash + +set -e + +name="$(basename $0)" + +: ${TOP_DIR:="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )"} + +source ${TOP_DIR}/docker/builder-include + +: ${DOCKER_FILE:="${TOP_DIR}/docker/Dockerfile.builder.$(arch)"} + +usage () { + echo "${name} - Builds a docker image that contains tools for building petitboot." >&2 + echo "Usage: ${name} [flags]" >&2 + echo "Option flags:" >&2 + echo " -d --dry-run - Do not run build commands." >&2 + echo " -h --help - Show this help and exit." >&2 + echo " -p --purge - Remove existing docker image and rebuild." >&2 + echo " -r --rebuild - Rebuild existing docker image." >&2 + echo " -t --tag - Print Docker tag to stdout and exit." >&2 + echo " -v --verbose - Verbose execution." >&2 + echo "Environment:" >&2 + echo " DOCKER_FILE - Default: '${DOCKER_FILE}'" >&2 + echo " DOCKER_TAG - Default: '${DOCKER_TAG}'" >&2 + echo "Examples:" >&2 + echo " ${name} -v" +} + +short_opts="dhprtv" +long_opts="dry-run,help,purge,rebuild,tag,verbose" + +opts=$(getopt --options ${short_opts} --long ${long_opts} -n "${name}" -- "$@") + +if [ $? != 0 ]; then + echo "${name}: ERROR: Internal getopt" >&2 + exit 1 +fi + +eval set -- "${opts}" + +while true ; do + case "${1}" in + -d | --dry-run) + dry_run=1 + shift + ;; + -h | --help) + usage=1 + shift + ;; + -p | --purge) + purge=1 + shift + ;; + -r | --rebuild) + rebuild=1 + shift + ;; + -t | --tag) + tag=1 + shift + ;; + -v | --verbose) + set -x + verbose=1 + shift + ;; + --) + shift + break + ;; + *) + echo "${name}: ERROR: Internal opts" >&2 + exit 1 + ;; + esac +done + +if [[ -n "${usage}" ]]; then + usage + exit 0 +fi + +if [[ -n "${tag}" ]]; then + show_tag + exit 0 +fi + +if [[ -n "${purge}" ]] && docker inspect --type image ${DOCKER_TAG} >/dev/null 2>/dev/null; then + echo "Removing docker image: ${DOCKER_TAG}" >&2 + run_cmd "docker rmi --force ${DOCKER_TAG}" +elif [[ -z "${rebuild}" ]] && docker inspect --type image ${DOCKER_TAG} >/dev/null 2>/dev/null; then + echo "Docker image exists: ${DOCKER_TAG}" >&2 + show_tag + exit 0 +fi + +echo "Building docker image: ${DOCKER_TAG}" >&2 + +cd ${TOP_DIR} +run_cmd "docker build --file ${DOCKER_FILE} --tag ${DOCKER_TAG} ." + +show_tag diff --git a/docker/build-pb b/docker/build-pb new file mode 100755 index 0000000..ce6c41f --- /dev/null +++ b/docker/build-pb @@ -0,0 +1,104 @@ +#!/usr/bin/env bash + +set -e + +name="$(basename $0)" + +: ${TOP_DIR:="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )"} + +source ${TOP_DIR}/docker/builder-include + +usage () { + echo "${name} - Builds the petitboot programs using a pb-builder container." >&2 + echo "Usage: ${name} [flags]" >&2 + echo "Option flags:" >&2 + echo " -c --check - Run 'make check'." >&2 + echo " -d --dry-run - Do not run docker commands." >&2 + echo " -h --help - Show this help and exit." >&2 + echo " -t --tag - Print Docker tag to stdout and exit." >&2 + echo " -v --verbose - Verbose execution." >&2 + echo "Environment:" >&2 + echo " DOCKER_TAG - Default: '${DOCKER_TAG}'" >&2 + echo "Examples:" >&2 + echo " ${name} -vc" + echo " ${name} -v" +} + +short_opts="cdhtv" +long_opts="check,dry-run,help,tag,verbose" + +opts=$(getopt --options ${short_opts} --long ${long_opts} -n "${name}" -- "$@") + +if [ $? != 0 ]; then + echo "${name}: ERROR: Internal getopt" >&2 + exit 1 +fi + +eval set -- "${opts}" + +while true ; do + case "${1}" in + -c | --check) + check=1 + shift + ;; + -d | --dry-run) + dry_run=1 + shift + ;; + -h | --help) + usage=1 + shift + ;; + -t | --tag) + tag=1 + shift + ;; + -v | --verbose) + set -x + verbose=1 + shift + ;; + --) + shift + break + ;; + *) + echo "${name}: ERROR: Internal opts" >&2 + exit 1 + ;; + esac +done + +if [[ -n "${usage}" ]]; then + usage + exit 0 +fi + +if [[ -n "${tag}" ]]; then + show_tag + exit 0 +fi + +docker_args="--rm \ + -u $(id -u):$(id -g) \ + -v /etc/group:/etc/group:ro \ + -v /etc/passwd:/etc/passwd:ro \ + -v ${TOP_DIR}:/opt/pb \ + -w /opt/pb \ +" + +if [[ -n "$verbose}" ]]; then + bash_debug="-x" +fi + +if [[ -n "${check}" ]]; then + docker_extra="make check" +else + docker_extra="true" +fi + +cd "${TOP_DIR}" +run_cmd "docker run ${docker_args} ${DOCKER_TAG} /bin/bash \ + -e ${bash_debug} \ + -c './bootstrap && ./configure --with-ncurses && make && ${docker_extra}'" diff --git a/docker/builder-include b/docker/builder-include new file mode 100644 index 0000000..40e0120 --- /dev/null +++ b/docker/builder-include @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +arch() { + local m="$(uname -m)" + + case "${m}" in + aarch64) echo "arm64" ;; + x86_64) echo "amd64" ;; + *) echo "${m}" ;; + esac +} + +arch_tag() { + local a="$(arch)" + + case "${a}" in + amd64) echo "" ;; + *) echo "-${a}" ;; + esac +} + +run_cmd () { + local cmd="${*}" + + if [[ -n ${verbose} || -n "${dry_run}" ]]; then + echo "==> ${cmd}" + fi + + if [[ -n "${dry_run}" ]]; then + true + else + eval "${cmd}" + fi +} + +show_tag () { + echo "${DOCKER_TAG}" +} + +: ${VERSION:="1"} +: ${ARCH_TAG:="$(arch_tag)"} +: ${DOCKER_NAME:="pb-builder"} +: ${DOCKER_TAG:="${DOCKER_NAME}:${VERSION}${ARCH_TAG}"} -- 2.39.2