| #!/bin/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 contributed man pages |
| man/md2man-all.sh -q |
| 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 |