[PATCH] docker: Add build container files

Geoff Levand geoff at infradead.org
Wed May 2 05:41:10 AEST 2018


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 <geoff at infradead.org>
---
Hi Sam,

I tested this on arm64 and amd64 and both work as expected.  For
both 'make check' (build-pb --check) reports no failures.

Please consider.

-Geoff

 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.14.1



More information about the Petitboot mailing list