project/PACKAGERS.md
9a677e6a
 # Dear Packager,
14bbbcd5
 
615667b8
 If you are looking to make Docker available on your favorite software
9a677e6a
 distribution, this document is for you. It summarizes the requirements for
 building and running the Docker client and the Docker daemon.
14bbbcd5
 
9a677e6a
 ## Getting Started
14bbbcd5
 
9a677e6a
 We want to help you package Docker successfully. Before doing any packaging, a
 good first step is to introduce yourself on the [docker-dev mailing
615667b8
 list](https://groups.google.com/d/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!
14bbbcd5
 
9a677e6a
 You can also join the IRC channel - #docker and #docker-dev on Freenode are both
 active and friendly.
14bbbcd5
 
d9ec3a03
 We like to refer to Tianon ("@tianon" on GitHub and "tianon" on IRC) as our
 "Packagers Relations", since he's always working to make sure our packagers have
 a good, healthy upstream to work with (both in our communication and in our
 build scripts). If you're having any kind of trouble, feel free to ping him
615667b8
 directly. He also likes to keep track of what distributions we have packagers
 for, so feel free to reach out to him even just to say "Hi!"
14bbbcd5
 
9a677e6a
 ## Package Name
14bbbcd5
 
9a677e6a
 If possible, your package should be called "docker". If that name is already
877d740d
 taken, a second choice is "docker-engine". Another possible choice is "docker.io".
5b361f31
 
9a677e6a
 ## Official Build vs Distro Build
5b361f31
 
9a677e6a
 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
615667b8
 way to build Docker. We encourage you to give it a try, and if the circumstances
 allow you to use it, we recommend that you do.
5b361f31
 
9a677e6a
 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.
 
615667b8
 ## Build Dependencies
14bbbcd5
 
615667b8
 To build Docker, you will need the following:
14bbbcd5
 
58520265
 * A recent version of Git and Mercurial
edadc2f4
 * Go version 1.6 or later
c41e51ce
 * A clean checkout of the source added to a valid [Go
5dc83233
   workspace](https://golang.org/doc/code.html#Workspaces) under the path
b3ee9ac7
   *src/github.com/docker/docker* (unless you plan to use `AUTO_GOPATH`,
58520265
   explained in more detail below)
c41e51ce
 
 To build the Docker daemon, you will additionally need:
 
 * An amd64/x86_64 machine running Linux
b2839007
 * SQLite version 3.7.9 or later
9a677e6a
 * libdevmapper version 1.02.68-cvs (2012-01-26) or later from lvm2 version
   2.02.89 or later
58520265
 * btrfs-progs version 3.16.1 or later (unless using an older version is
3761955e
   absolutely necessary, in which case 3.8 is the minimum)
35667c38
 * libseccomp version 2.2.1 or later (for build tag seccomp)
c41e51ce
 
 Be sure to also check out Docker's Dockerfile for the most up-to-date list of
 these build-time dependencies.
14bbbcd5
 
615667b8
 ### Go Dependencies
14bbbcd5
 
615667b8
 All Go dependencies are vendored under "./vendor". They are used by the official
 build, so the source of truth for the current version of each dependency is
 whatever is in "./vendor".
14bbbcd5
 
615667b8
 To use the vendored dependencies, simply make sure the path to "./vendor" is
 included in `GOPATH` (or use `AUTO_GOPATH`, as explained below).
14bbbcd5
 
615667b8
 If you would rather (or must, due to distro policy) package these dependencies
f2614f21
 yourself, take a look at "vendor.conf" for an easy-to-parse list of the
615667b8
 exact version for each.
14bbbcd5
 
9a677e6a
 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.
14bbbcd5
 
7ffd2b07
 ## Stripping Binaries
14bbbcd5
 
9a677e6a
 Please, please, please do not strip any compiled binaries. This is really
 important.
14bbbcd5
 
615667b8
 In our own testing, stripping the resulting binaries sometimes results in a
 binary that appears to work, but more often causes random panics, segfaults, and
 other issues. Even if the binary appears to work, please don't strip.
 
7ffd2b07
 See the following quotes from Dave Cheney, which explain this position better
 from the upstream Golang perspective.
 
 ### [go issue #5855, comment #3](https://code.google.com/p/go/issues/detail?id=5855#c3)
 
 > Super super important: Do not strip go binaries or archives. It isn't tested,
 > often breaks, and doesn't work.
 
 ### [launchpad golang issue #1200255, comment #8](https://bugs.launchpad.net/ubuntu/+source/golang/+bug/1200255/comments/8)
 
 > To quote myself: "Please do not strip Go binaries, it is not supported, not
 > tested, is often broken, and doesn't do what you want"
 >
 > To unpack that a bit
 >
 > * not supported, as in, we don't support it, and recommend against it when
 >   asked
 > * not tested, we don't test stripped binaries as part of the build CI process
 > * is often broken, stripping a go binary will produce anywhere from no, to
 >   subtle, to outright execution failure, see above
 
 ### [launchpad golang issue #1200255, comment #13](https://bugs.launchpad.net/ubuntu/+source/golang/+bug/1200255/comments/13)
 
 > To clarify my previous statements.
 >
 > * I do not disagree with the debian policy, it is there for a good reason
 > * Having said that, it stripping Go binaries doesn't work, and nobody is
 >   looking at making it work, so there is that.
 >
 > Thanks for patching the build formula.
14bbbcd5
 
 ## Building Docker
 
615667b8
 Please use our build script ("./hack/make.sh") for all your compilation of
 Docker. If there's something you need that it isn't doing, or something it could
 be doing to make your life as a packager easier, please get in touch with Tianon
 and help us rectify the situation. Chances are good that other packagers have
 probably run into the same problems and a fix might already be in the works, but
 none of us will know for sure unless you harass Tianon about it. :)
 
 All the commands listed within this section should be run with the Docker source
 checkout as the current working directory.
 
 ### `AUTO_GOPATH`
 
 If you'd rather not be bothered with the hassles that setting up `GOPATH`
 appropriately can be, and prefer to just get a "build that works", you should
 add something similar to this to whatever script or process you're using to
 build Docker:
14bbbcd5
 
fb8d4888
 ```bash
615667b8
 export AUTO_GOPATH=1
14bbbcd5
 ```
 
615667b8
 This will cause the build scripts to set up a reasonable `GOPATH` that
b3ee9ac7
 automatically and properly includes both docker/docker from the local
615667b8
 directory, and the local "./vendor" directory as necessary.
14bbbcd5
 
0b23393b
 ### `DOCKER_BUILDTAGS`
 
 If you're building a binary that may need to be used on platforms that include
 AppArmor, you will need to set `DOCKER_BUILDTAGS` as follows:
 ```bash
 export DOCKER_BUILDTAGS='apparmor'
 ```
 
1b31a80e
 If you're building a binary that may need to be used on platforms that include
 SELinux, you will need to use the `selinux` build tag:
 ```bash
 export DOCKER_BUILDTAGS='selinux'
 ```
 
b25b9b57
 If you're building a binary that may need to be used on platforms that include
 seccomp, you will need to use the `seccomp` build tag:
 ```bash
 export DOCKER_BUILDTAGS='seccomp'
 ```
 
670ce98c
 There are build tags for disabling graphdrivers as well. By default, support
 for all graphdrivers are built in.
 
29c45e7f
 To disable btrfs:
 ```bash
 export DOCKER_BUILDTAGS='exclude_graphdriver_btrfs'
 ```
 
 To disable devicemapper:
670ce98c
 ```bash
 export DOCKER_BUILDTAGS='exclude_graphdriver_devicemapper'
 ```
29c45e7f
 
 To disable aufs:
670ce98c
 ```bash
 export DOCKER_BUILDTAGS='exclude_graphdriver_aufs'
 ```
 
1b31a80e
 NOTE: if you need to set more than one build tag, space separate them:
4c435669
 ```bash
1b31a80e
 export DOCKER_BUILDTAGS='apparmor selinux exclude_graphdriver_aufs'
4c435669
 ```
 
615667b8
 ### Static Daemon
 
 If it is feasible within the constraints of your distribution, you should
 seriously consider packaging Docker as a single static binary. A good comparison
 is Busybox, which is often packaged statically as a feature to enable mass
 portability. Because of the unique way Docker operates, being similarly static
 is a "feature".
14bbbcd5
 
615667b8
 To build a static Docker daemon binary, run the following command (first
 ensuring that all the necessary libraries are available in static form for
 linking - see the "Build Dependencies" section above, and the relevant lines
 within Docker's own Dockerfile that set up our official build environment):
 
 ```bash
 ./hack/make.sh binary
 ```
14bbbcd5
 
615667b8
 This will create a static binary under
 "./bundles/$VERSION/binary/docker-$VERSION", where "$VERSION" is the contents of
 the file "./VERSION". This binary is usually installed somewhere like
 "/usr/bin/docker".
14bbbcd5
 
615667b8
 ### Dynamic Daemon / Client-only Binary
14bbbcd5
 
9e7651db
 If you are only interested in a Docker client binary, you can build using:
a40bb2aa
 
 ```bash
9e7651db
 ./hack/make.sh binary-client
a40bb2aa
 ```
 
615667b8
 If you need to (due to distro policy, distro library availability, or for other
 reasons) create a dynamically compiled daemon binary, or if you are only
 interested in creating a client binary for Docker, use something similar to the
 following:
21161dbd
 
 ```bash
9e7651db
 ./hack/make.sh dynbinary-client
21161dbd
 ```
 
9e7651db
 This will create "./bundles/$VERSION/dynbinary-client/docker-$VERSION", which for
615667b8
 client-only builds is the important file to grab and install as appropriate.
 
9a677e6a
 ## System Dependencies
a7f26522
 
615667b8
 ### Runtime Dependencies
14bbbcd5
 
615667b8
 To function properly, the Docker daemon needs the following software to be
 installed and available at runtime:
14bbbcd5
 
 * iptables version 1.4 or later
2e78ab91
 * procps (or similar provider of a "ps" executable)
2b766a45
 * e2fsprogs version 1.4.12 or later (in use: mkfs.ext4, tune2fs)
 * xfsprogs (in use: mkfs.xfs)
615667b8
 * XZ Utils version 4.9 or later
708ecd7d
 * a [properly
   mounted](https://github.com/tianon/cgroupfs-mount/blob/master/cgroupfs-mount)
   cgroupfs hierarchy (having a single, all-encompassing "cgroup" mount point
b3ee9ac7
   [is](https://github.com/docker/docker/issues/2683)
   [not](https://github.com/docker/docker/issues/3485)
   [sufficient](https://github.com/docker/docker/issues/4568))
615667b8
 
 Additionally, the Docker client needs the following software to be installed and
 available at runtime:
 
b2839007
 * Git version 1.7 or later
14bbbcd5
 
615667b8
 ### Kernel Requirements
14bbbcd5
 
615667b8
 The Docker daemon has very specific kernel requirements. Most pre-packaged
 kernels already include the necessary options enabled. If you are building your
 own kernel, you will either need to discover the options necessary via trial and
a7f26522
 error, or check out the [Gentoo
 ebuild](https://github.com/tianon/docker-overlay/blob/master/app-emulation/docker/docker-9999.ebuild),
615667b8
 in which a list is maintained (and if there are any issues or discrepancies in
 that list, please contact Tianon so they can be rectified).
14bbbcd5
 
615667b8
 Note that in client mode, there are no specific kernel requirements, and that
 the client will even run on alternative platforms such as Mac OS X / Darwin.
14bbbcd5
 
615667b8
 ### Optional Dependencies
a7f26522
 
 Some of Docker's features are activated by using optional command-line flags or
 by having support for them in the kernel or userspace. A few examples include:
 
 * AUFS graph driver (requires AUFS patches/support enabled in the kernel, and at
   least the "auplink" utility from aufs-tools)
58588009
 * BTRFS graph driver (requires BTRFS support enabled in the kernel)
d5151ca8
 * ZFS graph driver (requires userspace zfs-utils and a corresponding kernel module)
cde9e8bc
 * Libseccomp to allow running seccomp profiles with containers
a7f26522
 
615667b8
 ## Daemon Init Script
14bbbcd5
 
9a677e6a
 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. Be sure to
 check out the "contrib/init" folder in case a suitable init script already
615667b8
 exists (and if one does not, contact Tianon about whether it might be
 appropriate for your distro's init script to live there too!).
14bbbcd5
 
615667b8
 In general, Docker should be run as root, similar to the following:
14bbbcd5
 
fb8d4888
 ```bash
62cc802f
 dockerd
14bbbcd5
 ```
615667b8
 
 Generally, a `DOCKER_OPTS` variable of some kind is available for adding more
 flags (such as changing the graph driver to use BTRFS, switching the location of
 "/var/lib/docker", etc).
 
 ## Communicate
 
 As a final note, please do feel free to reach out to Tianon at any time for
 pretty much anything. He really does love hearing from our packagers and wants
 to make sure we're not being a "hostile upstream". As should be a given, we
 appreciate the work our packagers do to make sure we have broad distribution!