at 22.05-pre 244 lines 8.6 kB view raw
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}