Browse code

Add "builder-deb" base images for building ".deb" packages properly

Signed-off-by: Andrew "Tianon" Page <admwiggin@gmail.com>

Tianon Gravi authored on 2015/04/03 16:38:46
Showing 21 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,5 @@
0
+# `dockercore/builder-deb`
1
+
2
+This image's tags contain the dependencies for building Docker `.deb`s for each of the Debian-based platforms Docker targets.
3
+
4
+To add new tags, see [`contrib/builder/deb` in https://github.com/docker/docker](https://github.com/docker/docker/tree/master/contrib/builder/deb), specifically the `generate.sh` script, whose usage is described in a comment at the top of the file.
0 5
new file mode 100755
... ...
@@ -0,0 +1,10 @@
0
+#!/bin/bash
1
+set -e
2
+
3
+cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
4
+
5
+set -x
6
+./generate.sh
7
+for d in */; do
8
+	docker build -t "dockercore/builder-deb:$(basename "$d")" "$d"
9
+done
0 10
new file mode 100644
... ...
@@ -0,0 +1,14 @@
0
+#
1
+# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/generate.sh"!
2
+#
3
+
4
+FROM debian:jessie
5
+
6
+RUN apt-get update && apt-get install -y bash-completion btrfs-tools build-essential curl ca-certificates debhelper dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
7
+
8
+ENV GO_VERSION 1.4.2
9
+RUN curl -fsSL "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz" | tar xvzC /usr/local
10
+ENV PATH $PATH:/usr/local/go/bin
11
+
12
+ENV AUTO_GOPATH 1
13
+ENV DOCKER_BUILDTAGS apparmor selinux
0 14
new file mode 100644
... ...
@@ -0,0 +1,15 @@
0
+#
1
+# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/generate.sh"!
2
+#
3
+
4
+FROM debian:wheezy
5
+RUN echo deb http://http.debian.net/debian wheezy-backports main > /etc/apt/sources.list.d/wheezy-backports.list
6
+
7
+RUN apt-get update && apt-get install -y bash-completion btrfs-tools build-essential curl ca-certificates debhelper dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
8
+
9
+ENV GO_VERSION 1.4.2
10
+RUN curl -fsSL "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz" | tar xvzC /usr/local
11
+ENV PATH $PATH:/usr/local/go/bin
12
+
13
+ENV AUTO_GOPATH 1
14
+ENV DOCKER_BUILDTAGS apparmor selinux
0 15
new file mode 100755
... ...
@@ -0,0 +1,69 @@
0
+#!/bin/bash
1
+set -e
2
+
3
+# usage: ./generate.sh [versions]
4
+#    ie: ./generate.sh
5
+#        to update all Dockerfiles in this directory
6
+#    or: ./generate.sh debian-jessie
7
+#        to only update debian-jessie/Dockerfile
8
+#    or: ./generate.sh debian-newversion
9
+#        to create a new folder and a Dockerfile within it
10
+
11
+cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
12
+
13
+versions=( "$@" )
14
+if [ ${#versions[@]} -eq 0 ]; then
15
+	versions=( */ )
16
+fi
17
+versions=( "${versions[@]%/}" )
18
+
19
+for version in "${versions[@]}"; do
20
+	distro="${version%-*}"
21
+	suite="${version##*-}"
22
+	from="${distro}:${suite}"
23
+
24
+	mkdir -p "$version"
25
+	echo "$version -> FROM $from"
26
+	cat > "$version/Dockerfile" <<-EOF
27
+		#
28
+		# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/generate.sh"!
29
+		#
30
+
31
+		FROM $from
32
+	EOF
33
+
34
+	case "$from" in
35
+		debian:wheezy)
36
+			# add -backports, like our users have to
37
+			echo "RUN echo deb http://http.debian.net/debian $suite-backports main > /etc/apt/sources.list.d/$suite-backports.list" >> "$version/Dockerfile"
38
+			;;
39
+	esac
40
+
41
+	echo >> "$version/Dockerfile"
42
+
43
+	# this list is sorted alphabetically; please keep it that way
44
+	packages=(
45
+		bash-completion # for bash-completion debhelper integration
46
+		btrfs-tools # for "btrfs/ioctl.h" (and "version.h" if possible)
47
+		build-essential # "essential for building Debian packages"
48
+		curl ca-certificates # for downloading Go
49
+		debhelper # for easy ".deb" building
50
+		dh-systemd # for systemd debhelper integration
51
+		git # for "git commit" info in "docker -v"
52
+		libapparmor-dev # for "sys/apparmor.h"
53
+		libdevmapper-dev # for "libdevmapper.h"
54
+		libsqlite3-dev # for "sqlite3.h"
55
+	)
56
+	echo "RUN apt-get update && apt-get install -y ${packages[*]} --no-install-recommends && rm -rf /var/lib/apt/lists/*" >> "$version/Dockerfile"
57
+
58
+	echo >> "$version/Dockerfile"
59
+
60
+	awk '$1 == "ENV" && $2 == "GO_VERSION" { print; exit }' ../../../Dockerfile >> "$version/Dockerfile"
61
+	echo 'RUN curl -fsSL "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz" | tar xvzC /usr/local' >> "$version/Dockerfile"
62
+	echo 'ENV PATH $PATH:/usr/local/go/bin' >> "$version/Dockerfile"
63
+
64
+	echo >> "$version/Dockerfile"
65
+
66
+	echo 'ENV AUTO_GOPATH 1' >> "$version/Dockerfile"
67
+	awk '$1 == "ENV" && $2 == "DOCKER_BUILDTAGS" { print; exit }' ../../../Dockerfile >> "$version/Dockerfile"
68
+done
0 69
new file mode 100644
... ...
@@ -0,0 +1,14 @@
0
+#
1
+# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/generate.sh"!
2
+#
3
+
4
+FROM ubuntu-debootstrap:trusty
5
+
6
+RUN apt-get update && apt-get install -y bash-completion btrfs-tools build-essential curl ca-certificates debhelper dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
7
+
8
+ENV GO_VERSION 1.4.2
9
+RUN curl -fsSL "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz" | tar xvzC /usr/local
10
+ENV PATH $PATH:/usr/local/go/bin
11
+
12
+ENV AUTO_GOPATH 1
13
+ENV DOCKER_BUILDTAGS apparmor selinux
0 14
new file mode 100644
... ...
@@ -0,0 +1,14 @@
0
+#
1
+# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/generate.sh"!
2
+#
3
+
4
+FROM ubuntu-debootstrap:utopic
5
+
6
+RUN apt-get update && apt-get install -y bash-completion btrfs-tools build-essential curl ca-certificates debhelper dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
7
+
8
+ENV GO_VERSION 1.4.2
9
+RUN curl -fsSL "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz" | tar xvzC /usr/local
10
+ENV PATH $PATH:/usr/local/go/bin
11
+
12
+ENV AUTO_GOPATH 1
13
+ENV DOCKER_BUILDTAGS apparmor selinux
0 14
new file mode 100644
... ...
@@ -0,0 +1,14 @@
0
+#
1
+# THIS FILE IS AUTOGENERATED; SEE "contrib/builder/deb/generate.sh"!
2
+#
3
+
4
+FROM ubuntu-debootstrap:vivid
5
+
6
+RUN apt-get update && apt-get install -y bash-completion btrfs-tools build-essential curl ca-certificates debhelper dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
7
+
8
+ENV GO_VERSION 1.4.2
9
+RUN curl -fsSL "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz" | tar xvzC /usr/local
10
+ENV PATH $PATH:/usr/local/go/bin
11
+
12
+ENV AUTO_GOPATH 1
13
+ENV DOCKER_BUILDTAGS apparmor selinux
0 14
new file mode 100644
... ...
@@ -0,0 +1 @@
0
+9
0 1
new file mode 100644
... ...
@@ -0,0 +1,27 @@
0
+Source: docker-core
1
+Maintainer: Docker <support@docker.com>
2
+Homepage: https://dockerproject.com
3
+Vcs-Browser: https://github.com/docker/docker
4
+Vcs-Git: git://github.com/docker/docker.git
5
+
6
+Package: docker-core
7
+Architecture: linux-any
8
+Depends: iptables, ${misc:Depends}, ${perl:Depends}, ${shlibs:Depends}
9
+Recommends: aufs-tools,
10
+            ca-certificates,
11
+            cgroupfs-mount | cgroup-lite,
12
+            git,
13
+            xz-utils,
14
+            ${apparmor:Recommends}
15
+Conflicts: docker (<< 1.5~), docker.io, lxc-docker, lxc-docker-virtual-package
16
+Description: Docker: the open-source application container engine
17
+ Docker is an open source project to pack, ship and run any application as a
18
+ lightweight container
19
+ .
20
+ Docker containers are both hardware-agnostic and platform-agnostic. This means
21
+ they can run anywhere, from your laptop to the largest EC2 compute instance and
22
+ they can run anywhere, from your laptop to the largest EC2 compute instance and
23
+ everything in between - and they don't require you to use a particular
24
+ language, framework or packaging system. That makes them great building blocks
25
+ for deploying and scaling web apps, databases, and backend services without
26
+ depending on a particular stack or provider.
0 27
new file mode 100644
... ...
@@ -0,0 +1 @@
0
+contrib/completion/bash/docker
0 1
new file mode 120000
... ...
@@ -0,0 +1 @@
0
+../../../contrib/init/sysvinit-debian/docker.default
0 1
\ No newline at end of file
1 2
new file mode 120000
... ...
@@ -0,0 +1 @@
0
+../../../contrib/init/sysvinit-debian/docker
0 1
\ No newline at end of file
1 2
new file mode 120000
... ...
@@ -0,0 +1 @@
0
+../../../contrib/init/upstart/docker.conf
0 1
\ No newline at end of file
1 2
new file mode 100644
... ...
@@ -0,0 +1,10 @@
0
+#contrib/syntax/vim/doc/* /usr/share/vim/vimfiles/doc/
1
+#contrib/syntax/vim/ftdetect/* /usr/share/vim/vimfiles/ftdetect/
2
+#contrib/syntax/vim/syntax/* /usr/share/vim/vimfiles/syntax/
3
+contrib/*-integration usr/share/docker-core/contrib/
4
+contrib/check-config.sh usr/share/docker-core/contrib/
5
+contrib/completion/zsh/_docker usr/share/zsh/vendor-completions/
6
+contrib/init/systemd/docker.service lib/systemd/system/
7
+contrib/init/systemd/docker.socket lib/systemd/system/
8
+contrib/mk* usr/share/docker-core/contrib/
9
+contrib/nuke-graph-directory.sh usr/share/docker-core/contrib/
0 10
new file mode 100644
... ...
@@ -0,0 +1 @@
0
+docs/man/man*/*
0 1
new file mode 100644
... ...
@@ -0,0 +1,20 @@
0
+#!/bin/sh
1
+set -e
2
+
3
+case "$1" in
4
+	configure)
5
+		if [ -z "$2" ]; then
6
+			if ! getent group docker > /dev/null; then
7
+				groupadd --system docker
8
+			fi
9
+		fi
10
+		;;
11
+	abort-*)
12
+		# How'd we get here??
13
+		exit 1
14
+		;;
15
+	*)
16
+		;;
17
+esac
18
+
19
+#DEBHELPER#
0 20
new file mode 120000
... ...
@@ -0,0 +1 @@
0
+../../../contrib/udev/80-docker.rules
0 1
\ No newline at end of file
1 2
new file mode 100644
... ...
@@ -0,0 +1 @@
0
+README.md
0 1
new file mode 100755
... ...
@@ -0,0 +1,36 @@
0
+#!/usr/bin/make -f
1
+
2
+VERSION = $(shell cat VERSION)
3
+
4
+override_dh_gencontrol:
5
+	# if we're on Ubuntu, we need to Recommends: apparmor
6
+	echo 'apparmor:Recommends=$(shell dpkg-vendor --is Ubuntu && echo apparmor)' >> debian/docker-core.substvars
7
+	dh_gencontrol
8
+
9
+override_dh_auto_build:
10
+	./hack/make.sh dynbinary
11
+	# ./docs/man/md2man-all.sh runs outside the build container (if at all), since we don't have go-md2man here
12
+
13
+override_dh_auto_test:
14
+	./bundles/$(VERSION)/dynbinary/docker -v
15
+
16
+override_dh_strip:
17
+	# the SHA1 of dockerinit is important: don't strip it
18
+	# also, Go has lots of problems with stripping, so just don't
19
+
20
+override_dh_auto_install:
21
+	mkdir -p debian/docker-core/usr/bin
22
+	cp -aT "$$(readlink -f bundles/$(VERSION)/dynbinary/docker)" debian/docker-core/usr/bin/docker
23
+	mkdir -p debian/docker-core/usr/libexec/docker
24
+	cp -aT "$$(readlink -f bundles/$(VERSION)/dynbinary/dockerinit)" debian/docker-core/usr/libexec/docker/dockerinit
25
+
26
+override_dh_installinit:
27
+	# use "docker" as our service name, not "docker-core"
28
+	dh_installinit --name=docker
29
+
30
+override_dh_installudev:
31
+	# match our existing priority
32
+	dh_installudev --priority=z80
33
+
34
+%:
35
+	dh $@ --with=systemd,bash-completion
0 36
new file mode 100644
... ...
@@ -0,0 +1,82 @@
0
+#!/bin/bash
1
+set -e
2
+
3
+DEST=$1
4
+
5
+# subshell so that we can export PATH without breaking other things
6
+(
7
+	source "$(dirname "$BASH_SOURCE")/.integration-daemon-start"
8
+
9
+	# we need to wrap up everything in between integration-daemon-start and
10
+	# integration-daemon-stop to make sure we kill the daemon and don't hang,
11
+	# even and especially on test failures
12
+	didFail=
13
+	if ! {
14
+		set -e
15
+
16
+		# TODO consider using frozen images for the dockercore/builder-deb tags
17
+
18
+		debVersion="${VERSION//-/'~'}"
19
+		# if we have a "-dev" suffix or have change in Git, let's make this package version more complex so it works better
20
+		if [[ "$VERSION" == *-dev ]] || [ -n "$(git status --porcelain)" ]; then
21
+			gitUnix="$(git log -1 --pretty='%at')"
22
+			gitDate="$(date --date "@$gitUnix" +'%Y%m%d.%H%M%S')"
23
+			gitCommit="$(git log -1 --pretty='%h')"
24
+			gitVersion="git${gitDate}.0.${gitCommit}"
25
+			# gitVersion is now something like 'git20150128.112847.0.17e840a'
26
+			debVersion="$debVersion~$gitVersion"
27
+
28
+			# $ dpkg --compare-versions 1.5.0 gt 1.5.0~rc1 && echo true || echo false
29
+			# true
30
+			# $ dpkg --compare-versions 1.5.0~rc1 gt 1.5.0~git20150128.112847.17e840a && echo true || echo false
31
+			# true
32
+			# $ dpkg --compare-versions 1.5.0~git20150128.112847.17e840a gt 1.5.0~dev~git20150128.112847.17e840a && echo true || echo false
33
+			# true
34
+
35
+			# ie, 1.5.0 > 1.5.0~rc1 > 1.5.0~git20150128.112847.17e840a > 1.5.0~dev~git20150128.112847.17e840a
36
+		fi
37
+
38
+		debSource="$(awk -F ': ' '$1 == "Source" { print $2; exit }' hack/make/.build-deb/control)"
39
+		debMaintainer="$(awk -F ': ' '$1 == "Maintainer" { print $2; exit }' hack/make/.build-deb/control)"
40
+		debDate="$(date --rfc-2822)"
41
+
42
+		# if go-md2man is available, pre-generate the man pages
43
+		./docs/man/md2man-all.sh -q || true
44
+		# TODO decide if it's worth getting go-md2man in _each_ builder environment to avoid this
45
+
46
+		# TODO add a configurable knob for _which_ debs to build so we don't have to modify the file or build all of them every time we need to test
47
+		for dir in contrib/builder/deb/*/; do
48
+			version="$(basename "$dir")"
49
+			suite="${version##*-}"
50
+
51
+			image="dockercore/builder-deb:$version"
52
+			if ! docker inspect "$image" &> /dev/null; then
53
+				( set -x && docker build -t "$image" "$dir" )
54
+			fi
55
+
56
+			mkdir -p "$DEST/$version"
57
+			cat > "$DEST/$version/Dockerfile.build" <<-EOF
58
+				FROM $image
59
+				WORKDIR /usr/src/docker
60
+				COPY . /usr/src/docker
61
+				RUN ln -sfv hack/make/.build-deb debian
62
+				RUN { echo '$debSource (${debVersion}-0~${suite}) $suite; urgency=low'; echo; echo '  * Version: $VERSION'; echo; echo " -- $debMaintainer  $debDate"; } > debian/changelog && cat >&2 debian/changelog
63
+				RUN dpkg-buildpackage -uc -us
64
+			EOF
65
+			cp -a "$DEST/$version/Dockerfile.build" . # can't use $DEST because it's in .dockerignore...
66
+			tempImage="docker-temp/build-deb:$version"
67
+			( set -x && docker build -t "$tempImage" -f Dockerfile.build . )
68
+			docker run --rm "$tempImage" bash -c 'cd .. && tar -c *_*' | tar -xvC "$DEST/$version"
69
+			docker rmi "$tempImage"
70
+		done
71
+	}; then
72
+		didFail=1
73
+	fi
74
+
75
+	# clean up after ourselves
76
+	rm -f Dockerfile.build
77
+
78
+	source "$(dirname "$BASH_SOURCE")/.integration-daemon-stop"
79
+
80
+	[ -z "$didFail" ] # "set -e" ftw
81
+) 2>&1 | tee -a $DEST/test.log