1{ lib, callPackage, fetchFromGitHub }:
2
3with lib;
4
5rec {
6 dockerGen = {
7 version, rev, sha256
8 , moby-src
9 , runcRev, runcSha256
10 , containerdRev, containerdSha256
11 , tiniRev, tiniSha256, buildxSupport ? true, composeSupport ? true
12 # package dependencies
13 , stdenv, fetchFromGitHub, buildGoPackage
14 , makeWrapper, installShellFiles, pkg-config, glibc
15 , go-md2man, go, containerd_1_4, runc, docker-proxy, tini, libtool
16 , sqlite, iproute2, lvm2, systemd, docker-buildx, docker-compose_2
17 , btrfs-progs, iptables, e2fsprogs, xz, util-linux, xfsprogs, git
18 , procps, libseccomp
19 , nixosTests
20 , clientOnly ? !stdenv.isLinux, symlinkJoin
21 }:
22 let
23 docker-runc = runc.overrideAttrs (oldAttrs: {
24 name = "docker-runc-${version}";
25 inherit version;
26 src = fetchFromGitHub {
27 owner = "opencontainers";
28 repo = "runc";
29 rev = runcRev;
30 sha256 = runcSha256;
31 };
32 # docker/runc already include these patches / are not applicable
33 patches = [];
34 });
35
36 docker-containerd = containerd_1_4.overrideAttrs (oldAttrs: {
37 name = "docker-containerd-${version}";
38 inherit version;
39 src = fetchFromGitHub {
40 owner = "containerd";
41 repo = "containerd";
42 rev = containerdRev;
43 sha256 = containerdSha256;
44 };
45 buildInputs = oldAttrs.buildInputs ++ [ libseccomp ];
46 });
47
48 docker-tini = tini.overrideAttrs (oldAttrs: {
49 name = "docker-init-${version}";
50 inherit version;
51 src = fetchFromGitHub {
52 owner = "krallin";
53 repo = "tini";
54 rev = tiniRev;
55 sha256 = tiniSha256;
56 };
57
58 # Do not remove static from make files as we want a static binary
59 postPatch = "";
60
61 buildInputs = [ glibc glibc.static ];
62
63 NIX_CFLAGS_COMPILE = "-DMINIMAL=ON";
64 });
65
66 moby = buildGoPackage ((optionalAttrs (stdenv.isLinux)) rec {
67 name = "moby-${version}";
68 inherit version;
69 inherit docker-runc docker-containerd docker-proxy docker-tini;
70
71 src = moby-src;
72
73 goPackagePath = "github.com/docker/docker";
74
75 nativeBuildInputs = [ makeWrapper pkg-config go-md2man go libtool installShellFiles ];
76 buildInputs = [ sqlite lvm2 btrfs-progs systemd libseccomp ];
77
78 extraPath = optionals (stdenv.isLinux) (makeBinPath [ iproute2 iptables e2fsprogs xz xfsprogs procps util-linux git ]);
79
80 postPatch = ''
81 patchShebangs hack/make.sh hack/make/
82 '';
83
84 buildPhase = ''
85 export GOCACHE="$TMPDIR/go-cache"
86 # build engine
87 cd ./go/src/${goPackagePath}
88 export AUTO_GOPATH=1
89 export DOCKER_GITCOMMIT="${rev}"
90 export VERSION="${version}"
91 ./hack/make.sh dynbinary
92 cd -
93 '';
94
95 installPhase = ''
96 cd ./go/src/${goPackagePath}
97 install -Dm755 ./bundles/dynbinary-daemon/dockerd $out/libexec/docker/dockerd
98
99 makeWrapper $out/libexec/docker/dockerd $out/bin/dockerd \
100 --prefix PATH : "$out/libexec/docker:$extraPath"
101
102 ln -s ${docker-containerd}/bin/containerd $out/libexec/docker/containerd
103 ln -s ${docker-containerd}/bin/containerd-shim $out/libexec/docker/containerd-shim
104 ln -s ${docker-runc}/bin/runc $out/libexec/docker/runc
105 ln -s ${docker-proxy}/bin/docker-proxy $out/libexec/docker/docker-proxy
106 ln -s ${docker-tini}/bin/tini-static $out/libexec/docker/docker-init
107
108 # systemd
109 install -Dm644 ./contrib/init/systemd/docker.service $out/etc/systemd/system/docker.service
110 substituteInPlace $out/etc/systemd/system/docker.service --replace /usr/bin/dockerd $out/bin/dockerd
111 install -Dm644 ./contrib/init/systemd/docker.socket $out/etc/systemd/system/docker.socket
112 '';
113
114 DOCKER_BUILDTAGS = []
115 ++ optional (systemd != null) [ "journald" ]
116 ++ optional (btrfs-progs == null) "exclude_graphdriver_btrfs"
117 ++ optional (lvm2 == null) "exclude_graphdriver_devicemapper"
118 ++ optional (libseccomp != null) "seccomp";
119 });
120
121 plugins = optionals buildxSupport [ docker-buildx ]
122 ++ optionals composeSupport [ docker-compose_2 ];
123 pluginsRef = symlinkJoin { name = "docker-plugins"; paths = plugins; };
124 in
125 buildGoPackage ((optionalAttrs (!clientOnly) {
126
127 inherit docker-runc docker-containerd docker-proxy docker-tini moby;
128
129 }) // rec {
130 inherit version rev;
131
132 pname = "docker";
133
134 src = fetchFromGitHub {
135 owner = "docker";
136 repo = "cli";
137 rev = "v${version}";
138 sha256 = sha256;
139 };
140
141 goPackagePath = "github.com/docker/cli";
142
143 nativeBuildInputs = [
144 makeWrapper pkg-config go-md2man go libtool installShellFiles
145 ];
146 buildInputs = optionals (!clientOnly) [
147 sqlite lvm2 btrfs-progs systemd libseccomp
148 ] ++ plugins;
149
150 postPatch = ''
151 patchShebangs man scripts/build/
152 substituteInPlace ./scripts/build/.variables --replace "set -eu" ""
153 '' + optionalString (plugins != []) ''
154 substituteInPlace ./cli-plugins/manager/manager_unix.go --replace /usr/libexec/docker/cli-plugins \
155 "${pluginsRef}/libexec/docker/cli-plugins"
156 '';
157
158 # Keep eyes on BUILDTIME format - https://github.com/docker/cli/blob/${version}/scripts/build/.variables
159 buildPhase = ''
160 export GOCACHE="$TMPDIR/go-cache"
161
162 cd ./go/src/${goPackagePath}
163 # Mimic AUTO_GOPATH
164 mkdir -p .gopath/src/github.com/docker/
165 ln -sf $PWD .gopath/src/github.com/docker/cli
166 export GOPATH="$PWD/.gopath:$GOPATH"
167 export GITCOMMIT="${rev}"
168 export VERSION="${version}"
169 export BUILDTIME="1970-01-01T00:00:00Z"
170 source ./scripts/build/.variables
171 export CGO_ENABLED=1
172 go build -tags pkcs11 --ldflags "$LDFLAGS" github.com/docker/cli/cmd/docker
173 cd -
174 '';
175
176 outputs = ["out" "man"];
177
178 installPhase = ''
179 cd ./go/src/${goPackagePath}
180 install -Dm755 ./docker $out/libexec/docker/docker
181
182 makeWrapper $out/libexec/docker/docker $out/bin/docker \
183 --prefix PATH : "$out/libexec/docker:$extraPath"
184 '' + optionalString (!clientOnly) ''
185 # symlink docker daemon to docker cli derivation
186 ln -s ${moby}/bin/dockerd $out/bin/dockerd
187
188 # systemd
189 mkdir -p $out/etc/systemd/system
190 ln -s ${moby}/etc/systemd/system/docker.service $out/etc/systemd/system/docker.service
191 ln -s ${moby}/etc/systemd/system/docker.socket $out/etc/systemd/system/docker.socket
192 '' + ''
193 # completion (cli)
194 installShellCompletion --bash ./contrib/completion/bash/docker
195 installShellCompletion --fish ./contrib/completion/fish/docker.fish
196 installShellCompletion --zsh ./contrib/completion/zsh/_docker
197 '' + lib.optionalString (stdenv.hostPlatform == stdenv.buildPlatform) ''
198 # Generate man pages from cobra commands
199 echo "Generate man pages from cobra"
200 mkdir -p ./man/man1
201 go build -o ./gen-manpages github.com/docker/cli/man
202 ./gen-manpages --root . --target ./man/man1
203 '' + ''
204 # Generate legacy pages from markdown
205 echo "Generate legacy manpages"
206 ./man/md2man-all.sh -q
207
208 installManPage man/*/*.[1-9]
209 '';
210
211 passthru.tests = lib.optionals (!clientOnly) { inherit (nixosTests) docker; };
212
213 meta = {
214 homepage = "https://www.docker.com/";
215 description = "An open source project to pack, ship and run any application as a lightweight container";
216 license = licenses.asl20;
217 maintainers = with maintainers; [ offline tailhook vdemeester periklis mikroskeem maxeaubrey ];
218 platforms = with platforms; linux ++ darwin;
219 };
220
221 # Exposed for tarsum build on non-linux systems (build-support/docker/default.nix)
222 inherit moby-src;
223 });
224
225 # Get revisions from
226 # https://github.com/moby/moby/tree/${version}/hack/dockerfile/install/*
227 docker_20_10 = callPackage dockerGen rec {
228 version = "20.10.9";
229 rev = "v${version}";
230 sha256 = "1msqvzfccah6cggvf1pm7n35zy09zr4qg2aalgwpqigv0jmrbyd4";
231 moby-src = fetchFromGitHub {
232 owner = "moby";
233 repo = "moby";
234 rev = "v${version}";
235 sha256 = "04xx7m8s9vrkm67ba2k5i90053h5qqkjcvw5rc8w7m5a309xcp4n";
236 };
237 runcRev = "v1.0.2"; # v1.0.2
238 runcSha256 = "1bpckghjah0rczciw1a1ab8z718lb2d3k4mjm4zb45lpm3njmrcp";
239 containerdRev = "v1.4.11"; # v1.4.11
240 containerdSha256 = "02slv4gc2blxnmv0p8pkm139vjn6ihjblmn8ps2k1afbbyps0ilr";
241 tiniRev = "v0.19.0"; # v0.19.0
242 tiniSha256 = "1h20i3wwlbd8x4jr2gz68hgklh0lb0jj7y5xk1wvr8y58fip1rdn";
243 };
244}