mirror of
				https://github.com/moby/moby.git
				synced 2022-11-09 12:21:53 -05:00 
			
		
		
		
	This is especially important for distributions like NixOS where `/bin/bash` doesn't exist, or for MacOS users who've installed a newer version of Bash than the one that comes with their OS. Signed-off-by: Andrew "Tianon" Page <admwiggin@gmail.com>
		
			
				
	
	
		
			190 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/usr/bin/env bash
 | 
						|
 | 
						|
PKGVERSION="${VERSION//-/'~'}"
 | 
						|
# if we have a "-dev" suffix or have change in Git, let's make this package version more complex so it works better
 | 
						|
if [[ "$VERSION" == *-dev ]] || [ -n "$(git status --porcelain)" ]; then
 | 
						|
	GIT_UNIX="$(git log -1 --pretty='%at')"
 | 
						|
	GIT_DATE="$(date --date "@$GIT_UNIX" +'%Y%m%d.%H%M%S')"
 | 
						|
	GIT_COMMIT="$(git log -1 --pretty='%h')"
 | 
						|
	GIT_VERSION="git${GIT_DATE}.0.${GIT_COMMIT}"
 | 
						|
	# GIT_VERSION is now something like 'git20150128.112847.0.17e840a'
 | 
						|
	PKGVERSION="$PKGVERSION~$GIT_VERSION"
 | 
						|
fi
 | 
						|
 | 
						|
# $ dpkg --compare-versions 1.5.0 gt 1.5.0~rc1 && echo true || echo false
 | 
						|
# true
 | 
						|
# $ dpkg --compare-versions 1.5.0~rc1 gt 1.5.0~git20150128.112847.17e840a && echo true || echo false
 | 
						|
# true
 | 
						|
# $ dpkg --compare-versions 1.5.0~git20150128.112847.17e840a gt 1.5.0~dev~git20150128.112847.17e840a && echo true || echo false
 | 
						|
# true
 | 
						|
 | 
						|
# ie, 1.5.0 > 1.5.0~rc1 > 1.5.0~git20150128.112847.17e840a > 1.5.0~dev~git20150128.112847.17e840a
 | 
						|
 | 
						|
PACKAGE_ARCHITECTURE="$(dpkg-architecture -qDEB_HOST_ARCH)"
 | 
						|
PACKAGE_URL="https://www.docker.com/"
 | 
						|
PACKAGE_MAINTAINER="support@docker.com"
 | 
						|
PACKAGE_DESCRIPTION="Linux container runtime
 | 
						|
Docker complements LXC with a high-level API which operates at the process
 | 
						|
level. It runs unix processes with strong guarantees of isolation and
 | 
						|
repeatability across servers.
 | 
						|
Docker is a great building block for automating distributed systems:
 | 
						|
large-scale web deployments, database clusters, continuous deployment systems,
 | 
						|
private PaaS, service-oriented architectures, etc."
 | 
						|
PACKAGE_LICENSE="Apache-2.0"
 | 
						|
 | 
						|
# Build docker as an ubuntu package using FPM and REPREPRO (sue me).
 | 
						|
# bundle_binary must be called first.
 | 
						|
bundle_ubuntu() {
 | 
						|
	DIR="$ABS_DEST/build"
 | 
						|
 | 
						|
	# Include our udev rules
 | 
						|
	mkdir -p "$DIR/etc/udev/rules.d"
 | 
						|
	cp contrib/udev/80-docker.rules "$DIR/etc/udev/rules.d/"
 | 
						|
 | 
						|
	# Include our init scripts
 | 
						|
	mkdir -p "$DIR/etc/init"
 | 
						|
	cp contrib/init/upstart/docker.conf "$DIR/etc/init/"
 | 
						|
	mkdir -p "$DIR/etc/init.d"
 | 
						|
	cp contrib/init/sysvinit-debian/docker "$DIR/etc/init.d/"
 | 
						|
	mkdir -p "$DIR/etc/default"
 | 
						|
	cp contrib/init/sysvinit-debian/docker.default "$DIR/etc/default/docker"
 | 
						|
	mkdir -p "$DIR/lib/systemd/system"
 | 
						|
	cp contrib/init/systemd/docker.{service,socket} "$DIR/lib/systemd/system/"
 | 
						|
 | 
						|
	# Include contributed completions
 | 
						|
	mkdir -p "$DIR/etc/bash_completion.d"
 | 
						|
	cp contrib/completion/bash/docker "$DIR/etc/bash_completion.d/"
 | 
						|
	mkdir -p "$DIR/usr/share/zsh/vendor-completions"
 | 
						|
	cp contrib/completion/zsh/_docker "$DIR/usr/share/zsh/vendor-completions/"
 | 
						|
	mkdir -p "$DIR/etc/fish/completions"
 | 
						|
	cp contrib/completion/fish/docker.fish "$DIR/etc/fish/completions/"
 | 
						|
 | 
						|
	# Include man pages
 | 
						|
	make manpages
 | 
						|
	manRoot="$DIR/usr/share/man"
 | 
						|
	mkdir -p "$manRoot"
 | 
						|
	for manDir in man/man?; do
 | 
						|
		manBase="$(basename "$manDir")" # "man1"
 | 
						|
		for manFile in "$manDir"/*; do
 | 
						|
			manName="$(basename "$manFile")" # "docker-build.1"
 | 
						|
			mkdir -p "$manRoot/$manBase"
 | 
						|
			gzip -c "$manFile" > "$manRoot/$manBase/$manName.gz"
 | 
						|
		done
 | 
						|
	done
 | 
						|
 | 
						|
	# Copy the binary
 | 
						|
	# This will fail if the binary bundle hasn't been built
 | 
						|
	mkdir -p "$DIR/usr/bin"
 | 
						|
	cp "$DEST/../binary/docker-$VERSION" "$DIR/usr/bin/docker"
 | 
						|
 | 
						|
	# Generate postinst/prerm/postrm scripts
 | 
						|
	cat > "$DEST/postinst" <<'EOF'
 | 
						|
#!/bin/sh
 | 
						|
set -e
 | 
						|
set -u
 | 
						|
 | 
						|
if [ "$1" = 'configure' ] && [ -z "$2" ]; then
 | 
						|
	if ! getent group docker > /dev/null; then
 | 
						|
		groupadd --system docker
 | 
						|
	fi
 | 
						|
fi
 | 
						|
 | 
						|
if ! { [ -x /sbin/initctl ] && /sbin/initctl version 2>/dev/null | grep -q upstart; }; then
 | 
						|
	# we only need to do this if upstart isn't in charge
 | 
						|
	update-rc.d docker defaults > /dev/null || true
 | 
						|
fi
 | 
						|
if [ -n "$2" ]; then
 | 
						|
	_dh_action=restart
 | 
						|
else
 | 
						|
	_dh_action=start
 | 
						|
fi
 | 
						|
service docker $_dh_action 2>/dev/null || true
 | 
						|
 | 
						|
#DEBHELPER#
 | 
						|
EOF
 | 
						|
	cat > "$DEST/prerm" <<'EOF'
 | 
						|
#!/bin/sh
 | 
						|
set -e
 | 
						|
set -u
 | 
						|
 | 
						|
service docker stop 2>/dev/null || true
 | 
						|
 | 
						|
#DEBHELPER#
 | 
						|
EOF
 | 
						|
	cat > "$DEST/postrm" <<'EOF'
 | 
						|
#!/bin/sh
 | 
						|
set -e
 | 
						|
set -u
 | 
						|
 | 
						|
if [ "$1" = "purge" ] ; then
 | 
						|
	update-rc.d docker remove > /dev/null || true
 | 
						|
fi
 | 
						|
 | 
						|
# In case this system is running systemd, we make systemd reload the unit files
 | 
						|
# to pick up changes.
 | 
						|
if [ -d /run/systemd/system ] ; then
 | 
						|
	systemctl --system daemon-reload > /dev/null || true
 | 
						|
fi
 | 
						|
 | 
						|
#DEBHELPER#
 | 
						|
EOF
 | 
						|
	# TODO swaths of these were borrowed from debhelper's auto-inserted stuff, because we're still using fpm - we need to use debhelper instead, and somehow reconcile Ubuntu that way
 | 
						|
	chmod +x "$DEST/postinst" "$DEST/prerm" "$DEST/postrm"
 | 
						|
 | 
						|
	(
 | 
						|
		# switch directories so we create *.deb in the right folder
 | 
						|
		cd "$DEST"
 | 
						|
 | 
						|
		# create lxc-docker-VERSION package
 | 
						|
		fpm -s dir -C "$DIR" \
 | 
						|
			--name "lxc-docker-$VERSION" --version "$PKGVERSION" \
 | 
						|
			--after-install "$ABS_DEST/postinst" \
 | 
						|
			--before-remove "$ABS_DEST/prerm" \
 | 
						|
			--after-remove "$ABS_DEST/postrm" \
 | 
						|
			--architecture "$PACKAGE_ARCHITECTURE" \
 | 
						|
			--prefix / \
 | 
						|
			--depends iptables \
 | 
						|
			--deb-recommends aufs-tools \
 | 
						|
			--deb-recommends ca-certificates \
 | 
						|
			--deb-recommends git \
 | 
						|
			--deb-recommends xz-utils \
 | 
						|
			--deb-recommends 'cgroupfs-mount | cgroup-lite' \
 | 
						|
			--deb-suggests apparmor \
 | 
						|
			--description "$PACKAGE_DESCRIPTION" \
 | 
						|
			--maintainer "$PACKAGE_MAINTAINER" \
 | 
						|
			--conflicts docker \
 | 
						|
			--conflicts docker.io \
 | 
						|
			--conflicts lxc-docker-virtual-package \
 | 
						|
			--provides lxc-docker \
 | 
						|
			--provides lxc-docker-virtual-package \
 | 
						|
			--replaces lxc-docker \
 | 
						|
			--replaces lxc-docker-virtual-package \
 | 
						|
			--url "$PACKAGE_URL" \
 | 
						|
			--license "$PACKAGE_LICENSE" \
 | 
						|
			--config-files /etc/udev/rules.d/80-docker.rules \
 | 
						|
			--config-files /etc/init/docker.conf \
 | 
						|
			--config-files /etc/init.d/docker \
 | 
						|
			--config-files /etc/default/docker \
 | 
						|
			--deb-compression gz \
 | 
						|
			-t deb .
 | 
						|
		# TODO replace "Suggests: cgroup-lite" with "Recommends: cgroupfs-mount | cgroup-lite" once cgroupfs-mount is available
 | 
						|
 | 
						|
		# create empty lxc-docker wrapper package
 | 
						|
		fpm -s empty \
 | 
						|
			--name lxc-docker --version "$PKGVERSION" \
 | 
						|
			--architecture "$PACKAGE_ARCHITECTURE" \
 | 
						|
			--depends lxc-docker-$VERSION \
 | 
						|
			--description "$PACKAGE_DESCRIPTION" \
 | 
						|
			--maintainer "$PACKAGE_MAINTAINER" \
 | 
						|
			--url "$PACKAGE_URL" \
 | 
						|
			--license "$PACKAGE_LICENSE" \
 | 
						|
			--deb-compression gz \
 | 
						|
			-t deb
 | 
						|
	)
 | 
						|
 | 
						|
	# clean up after ourselves so we have a clean output directory
 | 
						|
	rm "$DEST/postinst" "$DEST/prerm" "$DEST/postrm"
 | 
						|
	rm -r "$DIR"
 | 
						|
}
 | 
						|
 | 
						|
bundle_ubuntu
 |