Jelajahi Sumber

Merge pull request #1847 from dotcloud/test-docker-in-docker

* Hack: make the build tool more dev-friendly and packager-friendly
Solomon Hykes 11 tahun lalu
induk
melakukan
a63cfe7153
13 mengubah file dengan 513 tambahan dan 191 penghapusan
  1. 3 0
      .gitignore
  2. 33 12
      Dockerfile
  3. 137 0
      hack/PACKAGERS.md
  4. 0 0
      hack/RELEASE-CHECKLIST.md
  5. 59 0
      hack/dind
  6. 91 0
      hack/make.sh
  7. 17 0
      hack/make/README.md
  8. 4 0
      hack/make/binary
  9. 27 0
      hack/make/test
  10. 94 0
      hack/make/ubuntu
  11. 7 0
      hack/release.sh
  12. 0 179
      hack/release/make.sh
  13. 41 0
      hack/vendor.sh

+ 3 - 0
.gitignore

@@ -14,3 +14,6 @@ docs/_templates
 .gopath/
 .dotcloud
 *.test
+bundles/
+.hg/
+.git/

+ 33 - 12
Dockerfile

@@ -1,5 +1,29 @@
 # This file describes the standard way to build Docker, using docker
-docker-version 0.4.2
+#
+# Usage:
+#
+# # Assemble the full dev environment. This is slow the first time.
+# docker build -t docker .
+# # Apparmor messes with privileged mode: disable it
+# /etc/init.d/apparmor stop ; /etc/init.d/apparmor teardown
+#
+# # Mount your source in an interactive container for quick testing:
+# docker run -v `pwd`:/go/src/github.com/dotcloud/docker -privileged -lxc-conf=lxc.aa_profile=unconfined -i -t docker bash
+#
+#
+# # Run the test suite:
+# docker run -privileged -lxc-conf=lxc.aa_profile=unconfined docker go test -v
+#
+# # Publish a release:
+# docker run -privileged -lxc-conf=lxc.aa_profile=unconfined \
+# -e AWS_S3_BUCKET=baz \
+# -e AWS_ACCESS_KEY=foo \
+# -e AWS_SECRET_KEY=bar \
+# -e GPG_PASSPHRASE=gloubiboulga \
+# -lxc-conf=lxc.aa_profile=unconfined -privileged docker hack/release.sh
+# 
+
+docker-version 0.6.1
 from	ubuntu:12.04
 maintainer	Solomon Hykes <solomon@dotcloud.com>
 # Build dependencies
@@ -11,7 +35,7 @@ run	apt-get install -y -q mercurial
 # Install Go
 run	curl -s https://go.googlecode.com/files/go1.1.2.linux-amd64.tar.gz | tar -v -C /usr/local -xz
 env	PATH	/usr/local/go/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
-env	GOPATH	/go
+env	GOPATH	/go:/go/src/github.com/dotcloud/docker/vendor
 env	CGO_ENABLED 0
 run	cd /tmp && echo 'package main' > t.go && go test -a -i -v
 # Ubuntu stuff
@@ -23,15 +47,12 @@ run	apt-get install -y -q python-pip
 run	pip install s3cmd
 run	pip install python-magic
 run	/bin/echo -e '[default]\naccess_key=$AWS_ACCESS_KEY\nsecret_key=$AWS_SECRET_KEY\n' > /.s3cfg
-# Download dependencies
-run	PKG=github.com/kr/pty REV=27435c699;		 git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV
-run	PKG=github.com/gorilla/context/ REV=708054d61e5; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV
-run	PKG=github.com/gorilla/mux/ REV=9b36453141c;	 git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV
-run	PKG=github.com/dotcloud/tar/ REV=e5ea6bb21a3294;	 git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV
-run	PKG=code.google.com/p/go.net/ REV=84a4013f96e0;  hg  clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && hg  checkout    $REV
+# Runtime dependencies
+run	apt-get install -y -q iptables
+run	apt-get install -y -q lxc
+volume	/var/lib/docker
+workdir	/go/src/github.com/dotcloud/docker
+# Wrap all commands in the "docker-in-docker" script to allow nested containers
+entrypoint ["hack/dind"]
 # Upload docker source
 add	.       /go/src/github.com/dotcloud/docker
-run	ln -s	/go/src/github.com/dotcloud/docker /src
-# Build the binary
-run	cd /go/src/github.com/dotcloud/docker && hack/release/make.sh
-cmd	cd /go/src/github.com/dotcloud/docker && hack/release/release.sh

+ 137 - 0
hack/PACKAGERS.md

@@ -0,0 +1,137 @@
+Dear packager.
+
+If you are looking to make docker available on your favorite software distribution,
+this document is for you. It summarizes the requirements for building and running
+docker.
+
+## Getting started
+
+We really want to help you package Docker successfully. Before anything, a good first step
+is to introduce yourself on the [docker-dev mailing list](https://groups.google.com/forum/?fromgroups#!forum/docker-dev)
+, explain what you''re trying to achieve, and tell us how we can help. Don''t worry, we don''t bite!
+There might even be someone already working on packaging for the same distro!
+
+You can also join the IRC channel - #docker and #docker-dev on Freenode are both active and friendly.
+
+## Package name
+
+If possible, your package should be called "docker". If that name is already taken, a second
+choice is "lxc-docker".
+
+## Official build vs distro build
+
+The Docker project maintains its own build and release toolchain. It is pretty neat and entirely
+based on Docker (surprise!). This toolchain is the canonical way to build Docker, and the only
+method supported by the development team. We encourage you to give it a try, and if the circumstances
+allow you to use it, we recommend that you do.
+
+You might not be able to use the official build toolchain - usually because your distribution has a
+toolchain and packaging policy of its own. We get it! Your house, your rules. The rest of this document
+should give you the information you need to package Docker your way, without denaturing it in
+the process.
+
+## System build dependencies
+
+To build docker, you will need the following system dependencies
+
+* An amd64 machine
+* A recent version of git and mercurial
+* Go version 1.1.2
+* A clean checkout of the source must be added to a valid Go [workspace](http://golang.org/doc/code.html#Workspaces)
+under the path *src/github.com/dotcloud/docker*. See 
+
+
+## Go dependencies
+
+All Go dependencies are vendored under ./vendor. They are used by the official build,
+so the source of truth for the current version is whatever is in ./vendor.
+
+To use the vendored dependencies, simply make sure the path to ./vendor is included in $GOPATH.
+
+If you would rather package these dependencies yourself, take a look at ./hack/vendor.sh for an
+easy-to-parse list of the exact version for each.
+
+NOTE: if you''re not able to package the exact version (to the exact commit) of a given dependency,
+please get in touch so we can remediate! Who knows what discrepancies can be caused by even the
+slightest deviation. We promise to do our best to make everybody happy.
+
+
+## Disabling CGO
+
+Make sure to disable CGO on your system, and then recompile the standard library on the build
+machine:
+
+```bash
+export CGO_ENABLED=0
+cd /tmp && echo 'package main' > t.go && go test -a -i -v
+```
+
+## Building Docker
+
+To build the docker binary, run the following command with the source checkout as the
+working directory:
+
+```
+./hack/make.sh binary
+```
+
+This will create a static binary under *./bundles/$VERSION/binary/docker-$VERSION*, where
+*$VERSION* is the contents of the file *./VERSION*.
+
+You are encouraged to use ./hack/make.sh without modification. If you must absolutely write
+your own script (are you really, really sure you need to? make.sh is really not that complicated),
+then please take care the respect the following:
+
+* In *./hack/make.sh*: $LDFLAGS, $VERSION and $GITCOMMIT
+* In *./hack/make/binary*: the exact build command to run
+
+You may be tempted to tweak these settings. In particular, being a rigorous maintainer, you may want
+to disable static linking. Please don''t! Docker *needs* to be statically linked to function properly.
+You would do the users of your distro a disservice and "void the docker warranty" by changing the flags.
+
+A good comparison is Busybox: all distros package it as a statically linked binary, because it just
+makes sense. Docker is the same way.
+
+## Testing Docker
+
+Before releasing your binary, make sure to run the tests! Run the following command with the source
+checkout as the working directory:
+
+```bash
+./hack/make.sh test
+```
+
+The test suite includes both live integration tests and unit tests, so you will need all runtime
+dependencies to be installed (see below).
+
+The test suite will also download a small test container, so you will need internet connectivity.
+
+
+## Runtime dependencies
+
+To run properly, docker needs the following software to be installed at runtime:
+
+* GNU Tar version 1.26 or later
+* iproute2 version 3.5 or later (build after 2012-05-21), and specifically the "ip" utility.
+* iptables version 1.4 or later
+* The lxc utility scripts (http://lxc.sourceforge.net) version 0.8 or later.
+* Git version 1.7 or later 
+
+## Kernel dependencies
+
+Docker in daemon mode has specific kernel requirements. For details, see
+http://docs.docker.io/en/latest/installation/kernel/
+
+Note that Docker also has a client mode, which can run on virtually any linux kernel (it even builds
+on OSX!).
+
+## Init script
+
+Docker expects to run as a daemon at machine startup. Your package will need to include a script
+for your distro''s process supervisor of choice.
+
+Docker should be run as root, with the following arguments:
+
+```
+docker -d
+```

+ 0 - 0
hack/release/README.md → hack/RELEASE-CHECKLIST.md


+ 59 - 0
hack/dind

@@ -0,0 +1,59 @@
+#!/bin/bash
+
+# DinD: a wrapper script which allows docker to be run inside a docker container.
+# Original version by Jerome Petazzoni <jerome@dotcloud.com>
+# See the blog post: http://blog.docker.io/2013/09/docker-can-now-run-within-docker/
+#
+# This script should be executed inside a docker container in privilieged mode
+# ('docker run -privileged', introduced in docker 0.6).
+
+# Usage: dind CMD [ARG...]
+
+# First, make sure that cgroups are mounted correctly.
+CGROUP=/sys/fs/cgroup
+
+[ -d $CGROUP ] || 
+	mkdir $CGROUP
+
+mountpoint -q $CGROUP || 
+	mount -n -t tmpfs -o uid=0,gid=0,mode=0755 cgroup $CGROUP || {
+		echo "Could not make a tmpfs mount. Did you use -privileged?"
+		exit 1
+	}
+
+# Mount the cgroup hierarchies exactly as they are in the parent system.
+for SUBSYS in $(cut -d: -f2 /proc/1/cgroup)
+do
+	[ -d $CGROUP/$SUBSYS ] || mkdir $CGROUP/$SUBSYS
+	mountpoint -q $CGROUP/$SUBSYS || 
+		mount -n -t cgroup -o $SUBSYS cgroup $CGROUP/$SUBSYS
+done
+
+# Note: as I write those lines, the LXC userland tools cannot setup
+# a "sub-container" properly if the "devices" cgroup is not in its
+# own hierarchy. Let's detect this and issue a warning.
+grep -q :devices: /proc/1/cgroup ||
+	echo "WARNING: the 'devices' cgroup should be in its own hierarchy."
+grep -qw devices /proc/1/cgroup ||
+	echo "WARNING: it looks like the 'devices' cgroup is not mounted."
+
+# Now, close extraneous file descriptors.
+pushd /proc/self/fd
+for FD in *
+do
+	case "$FD" in
+	# Keep stdin/stdout/stderr
+	[012])
+		;;
+	# Nuke everything else
+	*)
+		eval exec "$FD>&-"
+		;;
+	esac
+done
+popd
+
+# Mount /tmp
+mount -t tmpfs none /tmp
+
+exec $*

+ 91 - 0
hack/make.sh

@@ -0,0 +1,91 @@
+#!/bin/bash
+
+# This script builds various binary artifacts from a checkout of the docker
+# source code.
+#
+# Requirements:
+# - The current directory should be a checkout of the docker source code
+#   (http://github.com/dotcloud/docker). Whatever version is checked out
+#   will be built.
+# - The VERSION file, at the root of the repository, should exist, and
+#   will be used as Docker binary version and package version.
+# - The hash of the git commit will also be included in the Docker binary,
+#   with the suffix -dirty if the repository isn't clean.
+# - The script is intented to be run inside the docker container specified
+#   in the Dockerfile at the root of the source. In other words:
+#   DO NOT CALL THIS SCRIPT DIRECTLY.
+# - The right way to call this script is to invoke "docker build ." from
+#   your checkout of the Docker repository, and then
+#   "docker run hack/make.sh" in the resulting container image. 
+# 
+
+set -e
+
+# We're a nice, sexy, little shell script, and people might try to run us;
+# but really, they shouldn't. We want to be in a container!
+RESOLVCONF=$(readlink --canonicalize /etc/resolv.conf)
+grep -q "$RESOLVCONF" /proc/mounts || {
+	echo "# WARNING! I don't seem to be running in a docker container.
+	echo "# The result of this command might be an incorrect build, and will not be officially supported."
+	echo "# Try this: 'docker build -t docker . && docker run docker ./hack/make.sh'
+}
+
+# List of bundles to create when no argument is passed
+DEFAULT_BUNDLES=(
+	test
+	binary
+	ubuntu
+)
+
+VERSION=$(cat ./VERSION)
+GITCOMMIT=$(git rev-parse --short HEAD)
+if test -n "$(git status --porcelain)"
+then
+	GITCOMMIT="$GITCOMMIT-dirty"
+fi
+
+# Use these flags when compiling the tests and final binary
+LDFLAGS="-X main.GITCOMMIT $GITCOMMIT -X main.VERSION $VERSION -d -w"
+
+
+bundle() {
+	bundlescript=$1
+	bundle=$(basename $bundlescript)
+	echo "---> Making bundle: $bundle"
+	mkdir -p bundles/$VERSION/$bundle
+	source $bundlescript $(pwd)/bundles/$VERSION/$bundle
+}
+
+main() {
+
+	# We want this to fail if the bundles already exist.
+	# This is to avoid mixing bundles from different versions of the code.
+	mkdir -p bundles
+	if [ -e "bundles/$VERSION" ]; then
+		echo "bundles/$VERSION already exists. Removing."
+		rm -fr bundles/$VERSION && mkdir bundles/$VERSION || exit 1
+	fi
+	SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+	if [ $# -lt 1 ]; then
+		bundles=($DEFAULT_BUNDLES)
+	else
+		bundles=($@)
+	fi
+	for bundle in ${bundles[@]}; do
+		bundle $SCRIPTDIR/make/$bundle
+	done
+	cat <<EOF
+###############################################################################
+Now run the resulting image, making sure that you set AWS_S3_BUCKET,
+AWS_ACCESS_KEY, and AWS_SECRET_KEY environment variables:
+
+docker run -e AWS_S3_BUCKET=get-staging.docker.io \\
+              AWS_ACCESS_KEY=AKI1234... \\
+              AWS_SECRET_KEY=sEs3mE... \\
+              GPG_PASSPHRASE=sesame... \\
+              image_id_or_name
+###############################################################################
+EOF
+}
+
+main "$@"

+ 17 - 0
hack/make/README.md

@@ -0,0 +1,17 @@
+This directory holds scripts called by `make.sh` in the parent directory.
+
+Each script is named after the bundle it creates.
+They should not be called directly - instead, pass it as argument to make.sh, for example:
+
+```
+./hack/make.sh test
+./hack/make.sh binary ubuntu
+
+# Or to run all bundles:
+./hack/make.sh
+```
+
+To add a bundle:
+
+* Create a shell-compatible file here
+* Add it to $DEFAULT_BUNDLES in make.sh

+ 4 - 0
hack/make/binary

@@ -0,0 +1,4 @@
+
+DEST=$1
+
+go build -o $DEST/docker-$VERSION -ldflags "$LDFLAGS" ./docker

+ 27 - 0
hack/make/test

@@ -0,0 +1,27 @@
+DEST=$1
+
+set -e
+
+# Run Docker's test suite, including sub-packages, and store their output as a bundle
+bundle_test() {
+	{
+		date
+		for test_dir in $(find_test_dirs); do (
+			set -x
+			cd $test_dir
+			go test -v -ldflags "$LDFLAGS"
+		)  done
+	} 2>&1 | tee $DEST/test.log
+}
+
+
+# This helper function walks the current directory looking for directories
+# holding Go test files, and prints their paths on standard output, one per
+# line.
+find_test_dirs() {
+       find . -name '*_test.go' | grep -v '^./vendor' |
+               { while read f; do dirname $f; done; } |
+               sort -u
+}
+
+bundle_test

+ 94 - 0
hack/make/ubuntu

@@ -0,0 +1,94 @@
+#!/bin/sh
+
+DEST=$1
+
+PKGVERSION="$VERSION"
+if test -n "$(git status --porcelain)"
+then
+	PKGVERSION="$PKGVERSION-$(date +%Y%m%d%H%M%S)-$GITCOMMIT"
+fi
+
+PACKAGE_ARCHITECTURE="$(dpkg-architecture -qDEB_HOST_ARCH)"
+PACKAGE_URL="http://www.docker.io/"
+PACKAGE_MAINTAINER="docker@dotcloud.com"
+PACKAGE_DESCRIPTION="lxc-docker is a 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."
+
+UPSTART_SCRIPT='description     "Docker daemon"
+
+start on filesystem and started lxc-net
+stop on runlevel [!2345]
+
+respawn
+
+script
+    /usr/bin/docker -d
+end script
+'
+
+# Build docker as an ubuntu package using FPM and REPREPRO (sue me).
+# bundle_binary must be called first.
+bundle_ubuntu() {
+	DIR=$DEST/build
+
+	# Generate an upstart config file (ubuntu-specific)
+	mkdir -p $DIR/etc/init
+	echo "$UPSTART_SCRIPT" > $DIR/etc/init/docker.conf
+
+	# Copy the binary
+	# This will fail if the binary bundle hasn't been built
+	mkdir -p $DIR/usr/bin
+	# Copy the binary
+	# This will fail if the binary bundle hasn't been built
+	cp $DEST/../binary/docker-$VERSION $DIR/usr/bin/docker
+
+	# Generate postinstall/prerm scripts
+	cat >/tmp/postinstall <<EOF
+#!/bin/sh
+/sbin/stop docker || true
+/sbin/start docker
+EOF
+	cat >/tmp/prerm <<EOF
+#!/bin/sh
+/sbin/stop docker || true
+EOF
+	chmod +x /tmp/postinstall /tmp/prerm
+
+	(
+		cd $DEST
+		fpm -s dir -C $DIR \
+		    --name lxc-docker-$VERSION --version $PKGVERSION \
+		    --after-install /tmp/postinstall \
+		    --before-remove /tmp/prerm \
+		    --architecture "$PACKAGE_ARCHITECTURE" \
+		    --prefix / \
+		    --depends lxc --depends aufs-tools \
+		    --description "$PACKAGE_DESCRIPTION" \
+		    --maintainer "$PACKAGE_MAINTAINER" \
+		    --conflicts lxc-docker-virtual-package \
+		    --provides lxc-docker \
+		    --provides lxc-docker-virtual-package \
+		    --replaces lxc-docker \
+		    --replaces lxc-docker-virtual-package \
+		    --url "$PACKAGE_URL" \
+		    --vendor "$PACKAGE_VENDOR" \
+		    -t deb .
+		mkdir empty
+		fpm -s dir -C empty \
+		    --name lxc-docker --version $PKGVERSION \
+		    --architecture "$PACKAGE_ARCHITECTURE" \
+		    --depends lxc-docker-$VERSION \
+		    --description "$PACKAGE_DESCRIPTION" \
+		    --maintainer "$PACKAGE_MAINTAINER" \
+		    --url "$PACKAGE_URL" \
+		    --vendor "$PACKAGE_VENDOR" \
+		    -t deb .
+	)
+}
+
+bundle_ubuntu

+ 7 - 0
hack/release/release.sh → hack/release.sh

@@ -165,11 +165,18 @@ release_index() {
 	) | write_to_s3 s3://$BUCKET/index
 }
 
+release_test() {
+	if [ -e "bundles/$VERSION/test" ]; then
+		s3cmd --acl-public sync bundles/$VERSION/test/ s3://$BUCKET/test/
+	fi
+}
+
 main() {
 	setup_s3
 	release_binary
 	release_ubuntu
 	release_index
+	release_test
 }
 
 main

+ 0 - 179
hack/release/make.sh

@@ -1,179 +0,0 @@
-#!/bin/sh
-
-# This script builds various binary artifacts from a checkout of the docker
-# source code.
-#
-# Requirements:
-# - The current directory should be a checkout of the docker source code
-#   (http://github.com/dotcloud/docker). Whatever version is checked out
-#   will be built.
-# - The VERSION file, at the root of the repository, should exist, and
-#   will be used as Docker binary version and package version.
-# - The hash of the git commit will also be included in the Docker binary,
-#   with the suffix -dirty if the repository isn't clean.
-# - The script is intented to be run as part of a docker build, as defined
-#   in the Dockerfile at the root of the source. In other words:
-#   DO NOT CALL THIS SCRIPT DIRECTLY.
-# - The right way to call this script is to invoke "docker build ." from
-#   your checkout of the Docker repository.
-# 
-
-set -e
-
-# We're a nice, sexy, little shell script, and people might try to run us;
-# but really, they shouldn't. We want to be in a container!
-RESOLVCONF=$(readlink --canonicalize /etc/resolv.conf)
-grep -q "$RESOLVCONF" /proc/mounts || {
-	echo "# I will only run within a container."
-	echo "# Try this instead:"
-	echo "docker build ."
-	exit 1
-}
-
-VERSION=$(cat ./VERSION)
-PKGVERSION="$VERSION"
-GITCOMMIT=$(git rev-parse --short HEAD)
-if test -n "$(git status --porcelain)"
-then
-	GITCOMMIT="$GITCOMMIT-dirty"
-	PKGVERSION="$PKGVERSION-$(date +%Y%m%d%H%M%S)-$GITCOMMIT"
-fi
-
-PACKAGE_ARCHITECTURE="$(dpkg-architecture -qDEB_HOST_ARCH)"
-PACKAGE_URL="http://www.docker.io/"
-PACKAGE_MAINTAINER="docker@dotcloud.com"
-PACKAGE_DESCRIPTION="lxc-docker is a 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."
-
-UPSTART_SCRIPT='description     "Docker daemon"
-
-start on filesystem and started lxc-net
-stop on runlevel [!2345]
-
-respawn
-
-script
-    /usr/bin/docker -d
-end script
-'
-
-# Each "bundle" is a different type of build artefact: static binary, Ubuntu
-# package, etc.
-
-# Build Docker as a static binary file
-bundle_binary() {
-	mkdir -p bundles/$VERSION/binary
-	go build -o bundles/$VERSION/binary/docker-$VERSION \
-		-ldflags "-X main.GITCOMMIT $GITCOMMIT -X main.VERSION $VERSION -d -w" \
-		./docker
-}
-
-
-# Build Docker's test suite as a collection of binary files (one per
-# sub-package to test)
-bundle_test() {
-	mkdir -p bundles/$VERSION/test
-	for test_dir in $(find_test_dirs); do
-		test_binary=$(
-			cd $test_dir
-			go test -c -v -ldflags "-X main.GITCOMMIT $GITCOMMIT -X main.VERSION $VERSION -d -w" >&2
-			find . -maxdepth 1 -type f -name '*.test' -executable
-		)
-		cp $test_dir/$test_binary bundles/$VERSION/test/
-	done
-}
-
-# Build docker as an ubuntu package using FPM and REPREPRO (sue me).
-# bundle_binary must be called first.
-bundle_ubuntu() {
-	mkdir -p bundles/$VERSION/ubuntu
-
-	DIR=$(pwd)/bundles/$VERSION/ubuntu/build
-
-	# Generate an upstart config file (ubuntu-specific)
-	mkdir -p $DIR/etc/init
-	echo "$UPSTART_SCRIPT" > $DIR/etc/init/docker.conf
-
-	# Copy the binary
-	mkdir -p $DIR/usr/bin
-	cp bundles/$VERSION/binary/docker-$VERSION $DIR/usr/bin/docker
-
-	# Generate postinstall/prerm scripts
-	cat >/tmp/postinstall <<EOF
-#!/bin/sh
-/sbin/stop docker || true
-/sbin/start docker
-EOF
-	cat >/tmp/prerm <<EOF
-#!/bin/sh
-/sbin/stop docker || true
-EOF
-	chmod +x /tmp/postinstall /tmp/prerm
-
-	(
-		cd bundles/$VERSION/ubuntu
-		fpm -s dir -C $DIR \
-		    --name lxc-docker-$VERSION --version $PKGVERSION \
-		    --after-install /tmp/postinstall \
-		    --before-remove /tmp/prerm \
-		    --architecture "$PACKAGE_ARCHITECTURE" \
-		    --prefix / \
-		    --depends lxc --depends aufs-tools \
-		    --description "$PACKAGE_DESCRIPTION" \
-		    --maintainer "$PACKAGE_MAINTAINER" \
-		    --conflicts lxc-docker-virtual-package \
-		    --provides lxc-docker \
-		    --provides lxc-docker-virtual-package \
-		    --replaces lxc-docker \
-		    --replaces lxc-docker-virtual-package \
-		    --url "$PACKAGE_URL" \
-		    --vendor "$PACKAGE_VENDOR" \
-		    -t deb .
-		mkdir empty
-		fpm -s dir -C empty \
-		    --name lxc-docker --version $PKGVERSION \
-		    --architecture "$PACKAGE_ARCHITECTURE" \
-		    --depends lxc-docker-$VERSION \
-		    --description "$PACKAGE_DESCRIPTION" \
-		    --maintainer "$PACKAGE_MAINTAINER" \
-		    --url "$PACKAGE_URL" \
-		    --vendor "$PACKAGE_VENDOR" \
-		    -t deb .
-	)
-}
-
-
-# This helper function walks the current directory looking for directories
-# holding Go test files, and prints their paths on standard output, one per
-# line.
-find_test_dirs() {
-	find . -name '*_test.go' | 
-		{ while read f; do dirname $f; done; } | 
-		sort -u
-}
-
-
-main() {
-	bundle_binary
-	bundle_ubuntu
-	#bundle_test
-	cat <<EOF
-###############################################################################
-Now run the resulting image, making sure that you set AWS_S3_BUCKET,
-AWS_ACCESS_KEY, and AWS_SECRET_KEY environment variables:
-
-docker run -e AWS_S3_BUCKET=get-staging.docker.io \\
-              AWS_ACCESS_KEY=AKI1234... \\
-              AWS_SECRET_KEY=sEs3mE... \\
-              GPG_PASSPHRASE=sesame... \\
-              image_id_or_name
-###############################################################################
-EOF
-}
-
-main

+ 41 - 0
hack/vendor.sh

@@ -0,0 +1,41 @@
+#!/bin/bash
+
+# Downloads dependencies into vendor/ directory
+if [[ ! -d vendor ]]; then
+  mkdir vendor
+fi
+vendor_dir=${PWD}/vendor
+
+git_clone () {
+  PKG=$1
+  REV=$2
+  (
+    set -e
+    cd $vendor_dir
+    if [[ -d src/$PKG ]]; then
+      echo "src/$PKG already exists. Removing."
+      rm -fr src/$PKG
+    fi
+    cd $vendor_dir && git clone http://$PKG src/$PKG
+    cd src/$PKG && git checkout -f $REV && rm -fr .git
+  )
+}
+
+git_clone github.com/kr/pty 27435c699
+
+git_clone github.com/gorilla/context/ 708054d61e5
+
+git_clone github.com/gorilla/mux/ 9b36453141c
+
+git_clone github.com/dotcloud/tar/ d06045a6d9
+
+# Docker requires code.google.com/p/go.net/websocket
+PKG=code.google.com/p/go.net REV=84a4013f96e0
+(
+  set -e
+  cd $vendor_dir
+  if [[ ! -d src/$PKG ]]; then
+    hg clone https://$PKG src/$PKG
+  fi
+  cd src/$PKG && hg checkout -r $REV
+)