123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- #!/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 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
|