summaryrefslogtreecommitdiffstats
path: root/fuel-build/docker/mkimage
diff options
context:
space:
mode:
authorJonas Bjurel <jonas.bjurel@ericsson.com>2015-01-30 22:22:43 +0100
committerJonas Bjurel <jonas.bjurel@ericsson.com>2015-02-05 19:39:31 +0100
commitd29df40fd66d6a90fde858e8a0bc0d0e98a01794 (patch)
tree17e48a2b5978b21c5a44ac0234626e8bb39c0af3 /fuel-build/docker/mkimage
parent09247c2eca21891be5b04eda08a23d4a866a3b84 (diff)
Version 0.0.1 of /fuel-bild
This is a build system that rebases the result from fuel.org such that you can add or change packages/puppet manifests any way you like, and reliably produce a installable which can be reproduced any time. See README for more information. Signed-off-by: Jonas Bjurel <jonas.bjurel@ericsson.com>
Diffstat (limited to 'fuel-build/docker/mkimage')
-rwxr-xr-xfuel-build/docker/mkimage/debootstrap126
-rwxr-xr-xfuel-build/docker/mkimage/mkimage.sh116
2 files changed, 242 insertions, 0 deletions
diff --git a/fuel-build/docker/mkimage/debootstrap b/fuel-build/docker/mkimage/debootstrap
new file mode 100755
index 0000000..0862120
--- /dev/null
+++ b/fuel-build/docker/mkimage/debootstrap
@@ -0,0 +1,126 @@
+#!/usr/bin/env bash
+#
+set -e
+
+rootfsDir="$1"
+shift
+
+# we have to do a little fancy footwork to make sure "rootfsDir" becomes the second non-option argument to debootstrap
+
+before=()
+while [ $# -gt 0 ] && [[ "$1" == -* ]]; do
+ before+=( "$1" )
+ shift
+done
+
+suite="$1"
+shift
+
+(
+ set -x
+ debootstrap "${before[@]}" "$suite" "$rootfsDir" "$@"
+)
+
+# now for some Docker-specific tweaks
+
+# prevent init scripts from running during install/update
+echo >&2 "+ cat > '$rootfsDir/usr/sbin/policy-rc.d'"
+cat > "$rootfsDir/usr/sbin/policy-rc.d" <<'EOF'
+#!/bin/sh
+exit 101
+EOF
+chmod +x "$rootfsDir/usr/sbin/policy-rc.d"
+
+# prevent upstart scripts from running during install/update
+(
+ set -x
+ chroot "$rootfsDir" dpkg-divert --local --rename --add /sbin/initctl
+ ln -sf /bin/true "$rootfsDir/sbin/initctl"
+)
+
+# shrink the image, since apt makes us fat (wheezy: ~157.5MB vs ~120MB)
+( set -x; chroot "$rootfsDir" apt-get clean )
+
+# Ubuntu 10.04 sucks... :)
+if strings "$rootfsDir/usr/bin/dpkg" | grep -q unsafe-io; then
+ # force dpkg not to call sync() after package extraction (speeding up installs)
+ echo >&2 "+ echo force-unsafe-io > '$rootfsDir/etc/dpkg/dpkg.cfg.d/docker-apt-speedup'"
+ echo 'force-unsafe-io' > "$rootfsDir/etc/dpkg/dpkg.cfg.d/docker-apt-speedup"
+fi
+
+if [ -d "$rootfsDir/etc/apt/apt.conf.d" ]; then
+ # _keep_ us lean by effectively running "apt-get clean" after every install
+ aptGetClean='"rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true";'
+ echo >&2 "+ cat > '$rootfsDir/etc/apt/apt.conf.d/docker-clean'"
+ cat > "$rootfsDir/etc/apt/apt.conf.d/docker-clean" <<-EOF
+ DPkg::Post-Invoke { ${aptGetClean} };
+ APT::Update::Post-Invoke { ${aptGetClean} };
+
+ Dir::Cache::pkgcache "";
+ Dir::Cache::srcpkgcache "";
+ EOF
+
+ # remove apt-cache translations for fast "apt-get update"
+ echo >&2 "+ cat > '$rootfsDir/etc/apt/apt.conf.d/docker-no-languages'"
+ echo 'Acquire::Languages "none";' > "$rootfsDir/etc/apt/apt.conf.d/docker-no-languages"
+fi
+
+if [ -z "$DONT_TOUCH_SOURCES_LIST" ]; then
+ # tweak sources.list, where appropriate
+ lsbDist=
+ if [ -z "$lsbDist" -a -r "$rootfsDir/etc/os-release" ]; then
+ lsbDist="$(. "$rootfsDir/etc/os-release" && echo "$ID")"
+ fi
+ if [ -z "$lsbDist" -a -r "$rootfsDir/etc/lsb-release" ]; then
+ lsbDist="$(. "$rootfsDir/etc/lsb-release" && echo "$DISTRIB_ID")"
+ fi
+ if [ -z "$lsbDist" -a -r "$rootfsDir/etc/debian_version" ]; then
+ lsbDist='Debian'
+ fi
+ case "$lsbDist" in
+ debian|Debian)
+ # updates and security!
+ if [ "$suite" != 'sid' -a "$suite" != 'unstable' ]; then
+ (
+ set -x
+ sed -i "p; s/ $suite main$/ ${suite}-updates main/" "$rootfsDir/etc/apt/sources.list"
+ echo "deb http://security.debian.org $suite/updates main" >> "$rootfsDir/etc/apt/sources.list"
+ )
+ fi
+ ;;
+ ubuntu|Ubuntu)
+ # add the universe, updates, and security repositories
+ (
+ set -x
+ sed -i "
+ s/ $suite main$/ $suite main universe/; p;
+ s/ $suite main/ ${suite}-updates main/; p;
+ s/ $suite-updates main/ ${suite}-security main/
+ " "$rootfsDir/etc/apt/sources.list"
+ )
+ ;;
+ tanglu|Tanglu)
+ # add the updates repository
+ if [ "$suite" != 'devel' ]; then
+ (
+ set -x
+ sed -i "p; s/ $suite main$/ ${suite}-updates main/" "$rootfsDir/etc/apt/sources.list"
+ )
+ fi
+ ;;
+ steamos|SteamOS)
+ # add contrib and non-free
+ (
+ set -x
+ sed -i "s/ $suite main$/ $suite main contrib non-free/" "$rootfsDir/etc/apt/sources.list"
+ )
+ ;;
+ esac
+fi
+
+# make sure we're fully up-to-date, too
+(
+ set -x
+ chroot "$rootfsDir" apt-get update
+ chroot "$rootfsDir" apt-get dist-upgrade -y
+)
diff --git a/fuel-build/docker/mkimage/mkimage.sh b/fuel-build/docker/mkimage/mkimage.sh
new file mode 100755
index 0000000..3424258
--- /dev/null
+++ b/fuel-build/docker/mkimage/mkimage.sh
@@ -0,0 +1,116 @@
+#!/usr/bin/env bash
+##############################################################################
+# Copyright (c) 2015 Ericsson AB and others.
+# stefan.k.berg@ericsson.com
+# jonas.bjurel@ericsson.com
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+set -e
+
+mkimg="$(basename "$0")"
+
+usage() {
+ echo >&2 "usage: $mkimg [-d dir] [-t tag] script [script-args]"
+ echo >&2 " ie: $mkimg -t someuser/debian debootstrap --variant=minbase jessie"
+ echo >&2 " $mkimg -t someuser/ubuntu debootstrap --include=ubuntu-minimal trusty"
+ echo >&2 " $mkimg -t someuser/busybox busybox-static"
+ echo >&2 " $mkimg -t someuser/centos:5 rinse --distribution centos-5"
+ exit 1
+}
+
+scriptDir="$(dirname "$(readlink -f "$BASH_SOURCE")")"
+
+optTemp=$(getopt --options '+d:t:h' --longoptions 'dir:,tag:,help' --name "$mkimg" -- "$@")
+eval set -- "$optTemp"
+unset optTemp
+
+dir=
+tag=
+while true; do
+ case "$1" in
+ -d|--dir) dir="$2" ; shift 2 ;;
+ -t|--tag) tag="$2" ; shift 2 ;;
+ -h|--help) usage ;;
+ --) shift ; break ;;
+ esac
+done
+
+script="$1"
+[ "$script" ] || usage
+shift
+
+if [ ! -x "$scriptDir/$script" ]; then
+ echo >&2 "error: $script does not exist or is not executable"
+ echo >&2 " see $scriptDir for possible scripts"
+ exit 1
+fi
+
+# don't mistake common scripts like .febootstrap-minimize as image-creators
+if [[ "$script" == .* ]]; then
+ echo >&2 "error: $script is a script helper, not a script"
+ echo >&2 " see $scriptDir for possible scripts"
+ exit 1
+fi
+
+delDir=
+if [ -z "$dir" ]; then
+ dir="$(mktemp -d ${TMPDIR:-/tmp}/docker-mkimage.XXXXXXXXXX)"
+ delDir=1
+fi
+
+rootfsDir="$dir/rootfs"
+( set -x; mkdir -p "$rootfsDir" )
+
+# pass all remaining arguments to $script
+"$scriptDir/$script" "$rootfsDir" "$@"
+
+# Docker mounts tmpfs at /dev and procfs at /proc so we can remove them
+rm -rf "$rootfsDir/dev" "$rootfsDir/proc"
+mkdir -p "$rootfsDir/dev" "$rootfsDir/proc"
+
+# make sure /etc/resolv.conf has something useful in it
+mkdir -p "$rootfsDir/etc"
+cat > "$rootfsDir/etc/resolv.conf" <<'EOF'
+nameserver 8.8.8.8
+nameserver 8.8.4.4
+EOF
+
+tarFile="$dir/rootfs.tar.xz"
+touch "$tarFile"
+
+(
+ set -x
+ tar --numeric-owner -caf "$tarFile" -C "$rootfsDir" --transform='s,^./,,' .
+)
+
+echo >&2 "+ cat > '$dir/Dockerfile'"
+cat > "$dir/Dockerfile" <<'EOF'
+FROM scratch
+ADD rootfs.tar.xz /
+EOF
+
+# if our generated image has a decent shell, let's set a default command
+for shell in /bin/bash /usr/bin/fish /usr/bin/zsh /bin/sh; do
+ if [ -x "$rootfsDir/$shell" ]; then
+ ( set -x; echo 'CMD ["'"$shell"'"]' >> "$dir/Dockerfile" )
+ break
+ fi
+done
+
+umount $rootfsDir/run/shm
+( set -x; rm -rf "$rootfsDir" )
+
+if [ "$tag" ]; then
+ ( set -x; docker build -t "$tag" "$dir" )
+elif [ "$delDir" ]; then
+ # if we didn't specify a tag and we're going to delete our dir, let's just build an untagged image so that we did _something_
+ ( set -x; docker build "$dir" )
+fi
+
+if [ "$delDir" ]; then
+ ( set -x; rm -rf "$dir" )
+fi