1{ stdenv, lib, fetchFromGitHub, makeWrapper, removeReferencesTo, pkgconfig
2, go-md2man, go, containerd, runc, docker-proxy, tini, libtool
3, sqlite, iproute, bridge-utils, devicemapper, systemd
4, btrfs-progs, iptables, e2fsprogs, xz, utillinux, xfsprogs
5, procps, libseccomp
6}:
7
8with lib;
9
10rec {
11 dockerGen = {
12 version, rev, sha256
13 , runcRev, runcSha256
14 , containerdRev, containerdSha256
15 , tiniRev, tiniSha256
16 } : stdenv.mkDerivation rec {
17 inherit version rev;
18
19 name = "docker-${version}";
20
21 src = fetchFromGitHub {
22 owner = "docker";
23 repo = "docker-ce";
24 rev = "v${version}";
25 sha256 = sha256;
26 };
27
28 docker-runc = runc.overrideAttrs (oldAttrs: rec {
29 name = "docker-runc";
30 src = fetchFromGitHub {
31 owner = "docker";
32 repo = "runc";
33 rev = runcRev;
34 sha256 = runcSha256;
35 };
36 # docker/runc already include these patches / are not applicable
37 patches = [];
38 });
39 docker-containerd = containerd.overrideAttrs (oldAttrs: rec {
40 name = "docker-containerd";
41 src = fetchFromGitHub {
42 owner = "docker";
43 repo = "containerd";
44 rev = containerdRev;
45 sha256 = containerdSha256;
46 };
47 });
48 docker-tini = tini.overrideAttrs (oldAttrs: rec {
49 name = "docker-init";
50 src = fetchFromGitHub {
51 owner = "krallin";
52 repo = "tini";
53 rev = tiniRev;
54 sha256 = tiniSha256;
55 };
56
57 # Do not remove static from make files as we want a static binary
58 patchPhase = ''
59 '';
60
61 NIX_CFLAGS_COMPILE = [
62 "-DMINIMAL=ON"
63 ];
64 });
65
66 # Optimizations break compilation of libseccomp c bindings
67 hardeningDisable = [ "fortify" ];
68
69 buildInputs = [
70 makeWrapper removeReferencesTo pkgconfig go-md2man go
71 sqlite devicemapper btrfs-progs systemd libtool libseccomp
72 ];
73
74 dontStrip = true;
75
76 DOCKER_BUILDTAGS = []
77 ++ optional (systemd != null) [ "journald" ]
78 ++ optional (btrfs-progs == null) "exclude_graphdriver_btrfs"
79 ++ optional (devicemapper == null) "exclude_graphdriver_devicemapper"
80 ++ optional (libseccomp != null) "seccomp";
81
82 buildPhase = ''
83 # build engine
84 cd ./components/engine
85 export AUTO_GOPATH=1
86 export DOCKER_GITCOMMIT="${rev}"
87 ./hack/make.sh dynbinary
88 cd -
89
90 # build cli
91 cd ./components/cli
92 # Mimic AUTO_GOPATH
93 mkdir -p .gopath/src/github.com/docker/
94 ln -sf $PWD .gopath/src/github.com/docker/cli
95 export GOPATH="$PWD/.gopath:$GOPATH"
96 export GITCOMMIT="${rev}"
97 export VERSION="${version}"
98 source ./scripts/build/.variables
99 export CGO_ENABLED=1
100 go build -tags pkcs11 --ldflags "$LDFLAGS" github.com/docker/cli/cmd/docker
101 cd -
102 '';
103
104 # systemd 230 no longer has libsystemd-journal as a separate entity from libsystemd
105 patchPhase = ''
106 patchShebangs .
107 substituteInPlace ./components/engine/hack/make.sh --replace libsystemd-journal libsystemd
108 substituteInPlace ./components/engine/daemon/logger/journald/read.go --replace libsystemd-journal libsystemd
109 substituteInPlace ./components/cli/scripts/build/.variables --replace "set -eu" ""
110 '';
111
112 outputs = ["out" "man"];
113
114 extraPath = makeBinPath [ iproute iptables e2fsprogs xz xfsprogs procps utillinux ];
115
116 installPhase = ''
117 install -Dm755 ./components/cli/docker $out/libexec/docker/docker
118 install -Dm755 ./components/engine/bundles/${version}/dynbinary-daemon/dockerd-${version} $out/libexec/docker/dockerd
119 makeWrapper $out/libexec/docker/docker $out/bin/docker \
120 --prefix PATH : "$out/libexec/docker:$extraPath"
121 makeWrapper $out/libexec/docker/dockerd $out/bin/dockerd \
122 --prefix PATH : "$out/libexec/docker:$extraPath"
123
124 # docker uses containerd now
125 ln -s ${docker-containerd}/bin/containerd $out/libexec/docker/docker-containerd
126 ln -s ${docker-containerd}/bin/containerd-shim $out/libexec/docker/docker-containerd-shim
127 ln -s ${docker-runc}/bin/runc $out/libexec/docker/docker-runc
128 ln -s ${docker-proxy}/bin/docker-proxy $out/libexec/docker/docker-proxy
129 ln -s ${docker-tini}/bin/tini-static $out/libexec/docker/docker-init
130
131 # systemd
132 install -Dm644 ./components/engine/contrib/init/systemd/docker.service $out/etc/systemd/system/docker.service
133
134 # completion (cli)
135 install -Dm644 ./components/cli/contrib/completion/bash/docker $out/share/bash-completion/completions/docker
136 install -Dm644 ./components/cli/contrib/completion/fish/docker.fish $out/share/fish/vendor_completions.d/docker.fish
137 install -Dm644 ./components/cli/contrib/completion/zsh/_docker $out/share/zsh/site-functions/_docker
138
139 # Include contributed man pages (cli)
140 # Generate man pages from cobra commands
141 echo "Generate man pages from cobra"
142 cd ./components/cli
143 mkdir -p ./man/man1
144 go build -o ./gen-manpages github.com/docker/cli/man
145 ./gen-manpages --root . --target ./man/man1
146
147 # Generate legacy pages from markdown
148 echo "Generate legacy manpages"
149 ./man/md2man-all.sh -q
150
151 manRoot="$man/share/man"
152 mkdir -p "$manRoot"
153 for manDir in ./man/man?; do
154 manBase="$(basename "$manDir")" # "man1"
155 for manFile in "$manDir"/*; do
156 manName="$(basename "$manFile")" # "docker-build.1"
157 mkdir -p "$manRoot/$manBase"
158 gzip -c "$manFile" > "$manRoot/$manBase/$manName.gz"
159 done
160 done
161 '';
162
163 preFixup = ''
164 find $out -type f -exec remove-references-to -t ${go} -t ${stdenv.cc.cc} -t ${stdenv.glibc.dev} '{}' +
165 '';
166
167 meta = {
168 homepage = https://www.docker.com/;
169 description = "An open source project to pack, ship and run any application as a lightweight container";
170 license = licenses.asl20;
171 maintainers = with maintainers; [ offline tailhook vdemeester ];
172 platforms = platforms.linux;
173 };
174 };
175
176 # Get revisions from
177 # https://github.com/docker/docker-ce/blob/v${version}/components/engine/hack/dockerfile/binaries-commits
178
179 docker_17_06 = dockerGen rec {
180 version = "17.06.1-ce";
181 rev = "874a7374f31c77aca693d025101b2de1b20b96c2"; # git commit
182 sha256 = "08xhww2rhpyj73zgh5maycs85zpc0sm3ak8yyyd92dwgncmyi2im";
183 runcRev = "2d41c047c83e09a6d61d464906feb2a2f3c52aa4";
184 runcSha256 = "0v5iv29ck6lkxvxh7a56gfrlgfs0bjvjhrq3p6qqv9qjzv825byq";
185 containerdRev = "3addd840653146c90a254301d6c3a663c7fd6429";
186 containerdSha256 = "0as4s5wd57pdh1cyavkccpgs46kvlhr41v07qrv0phzffdhq3d5j";
187 tiniRev = "949e6facb77383876aeff8a6944dde66b3089574";
188 tiniSha256 = "0zj4kdis1vvc6dwn4gplqna0bs7v6d1y2zc8v80s3zi018inhznw";
189 };
190
191 docker_17_07 = dockerGen rec {
192 version = "17.07.0-ce";
193 rev = "87847530f7176a48348d196f7c23bbd058052af1"; # git commit
194 sha256 = "0zw9zlzbd7il33ch17ypwpa73gsb930sf2njnphg7ylvnqp8qzsp";
195 runcRev = "2d41c047c83e09a6d61d464906feb2a2f3c52aa4";
196 runcSha256 = "0v5iv29ck6lkxvxh7a56gfrlgfs0bjvjhrq3p6qqv9qjzv825byq";
197 containerdRev = "3addd840653146c90a254301d6c3a663c7fd6429";
198 containerdSha256 = "0as4s5wd57pdh1cyavkccpgs46kvlhr41v07qrv0phzffdhq3d5j";
199 tiniRev = "949e6facb77383876aeff8a6944dde66b3089574";
200 tiniSha256 = "0zj4kdis1vvc6dwn4gplqna0bs7v6d1y2zc8v80s3zi018inhznw";
201 };
202}