X-Git-Url: https://git.hcoop.net/jackhill/guix/guix.git/blobdiff_plain/03e856ddf5d28bc61144effb1a393b73cb4a2d9f..533c95bc17cd253455be077a54b1435d0c60950c:/gnu/packages/docker.scm diff --git a/gnu/packages/docker.scm b/gnu/packages/docker.scm index 3cfdb7ef55..948cc30cf6 100644 --- a/gnu/packages/docker.scm +++ b/gnu/packages/docker.scm @@ -1,5 +1,8 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 David Thompson +;;; Copyright © 2018 Efraim Flashner +;;; Copyright © 2019 Tobias Geerinckx-Rice +;;; Copyright © 2019 Maxim Cournoyer ;;; ;;; This file is part of GNU Guix. ;;; @@ -22,28 +25,52 @@ #:use-module (guix packages) #:use-module (guix download) #:use-module (guix git-download) + #:use-module (guix build-system cmake) + #:use-module (guix build-system gnu) + #:use-module (guix build-system go) #:use-module (guix build-system python) #:use-module (guix utils) - #:use-module (gnu packages python)) + #:use-module (gnu packages autotools) + #:use-module (gnu packages base) + #:use-module (gnu packages check) + #:use-module (gnu packages compression) + #:use-module (gnu packages glib) + #:use-module (gnu packages golang) + #:use-module (gnu packages linux) + #:use-module (gnu packages networking) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages python) + #:use-module (gnu packages python-crypto) + #:use-module (gnu packages python-web) + #:use-module (gnu packages python-xyz) + #:use-module (gnu packages version-control) + #:use-module (gnu packages virtualization)) + +(define %docker-version "18.09.5") (define-public python-docker-py (package (name "python-docker-py") - (version "1.6.0") + (version "3.7.3") (source (origin (method url-fetch) - (uri (pypi-uri "docker-py" version)) + (uri (pypi-uri "docker" version)) (sha256 (base32 - "16ba4xyd46hkj9nkfpz15r8kskl7ljx1afjzchyrhdsrklvzgzim")))) + "0qmrcvpaz37p85hfddsd4yc8hgqlkzs4cz09q9wmy0pz5pwajqm0")))) (build-system python-build-system) ;; TODO: Tests require a running Docker daemon. (arguments '(#:tests? #f)) (inputs - `(("python-requests" ,python-requests) + `(("python-requests" ,python-requests-2.20) + ("python-ipaddress" ,python-ipaddress) ("python-six" ,python-six) + ("python-urllib3" ,python-urllib3-1.24) ("python-websocket-client" ,python-websocket-client))) + (propagated-inputs + `(("python-docker-pycreds" ,python-docker-pycreds) + ("python-paramiko" ,python-paramiko))) ; adds SSH support (home-page "https://github.com/docker/docker-py/") (synopsis "Python client for Docker") (description "Docker-Py is a Python client for the Docker container @@ -53,14 +80,14 @@ management tool.") (define-public python-dockerpty (package (name "python-dockerpty") - (version "0.3.4") + (version "0.4.1") (source (origin (method url-fetch) (uri (pypi-uri "dockerpty" version)) (sha256 (base32 - "0za6rr349641wv76ww9l3zcic2xyxrirlxpnzl4296h897648455")))) + "1kjn64wx23jmr8dcc6g7bwlmrhfmxr77gh6iphqsl39sayfxdab9")))) (build-system python-build-system) (native-inputs `(("python-six" ,python-six))) @@ -71,27 +98,31 @@ pseudo-terminal (PTY) allocated to a Docker container using the Python client.") (license license:asl2.0))) +;; When updating, check whether python-jsonschema-2.6 can be removed from Guix +;; entirely. (define-public docker-compose (package (name "docker-compose") - (version "1.5.2") + (version "1.24.1") (source (origin (method url-fetch) (uri (pypi-uri "docker-compose" version)) (sha256 (base32 - "0ksg7hm2yvc977968dixxisrhcmvskzpcx3pz0v1kazrdqp7xakr")))) + "0lx7bx6jvhydbab8vwry0bclhdf0dfj6jrns1m5y45yp9ybqxmd5")))) (build-system python-build-system) ;; TODO: Tests require running Docker daemon. (arguments '(#:tests? #f)) (inputs - `(("python-docker-py" ,python-docker-py) + `(("python-cached-property" + ,python-cached-property) + ("python-docker-py" ,python-docker-py) ("python-dockerpty" ,python-dockerpty) ("python-docopt" ,python-docopt) - ("python-jsonschema" ,python-jsonschema) + ("python-jsonschema" ,python-jsonschema-2.6) ("python-pyyaml" ,python-pyyaml) - ("python-requests" ,python-requests-2.7) + ("python-requests" ,python-requests-2.20) ("python-six" ,python-six) ("python-texttable" ,python-texttable) ("python-websocket-client" ,python-websocket-client))) @@ -102,3 +133,578 @@ multi-container Docker applications. A Compose file is used to configure an application’s services. Then, using a single command, the containers are created and all the services are started as specified in the configuration.") (license license:asl2.0))) + +(define-public python-docker-pycreds + (package + (name "python-docker-pycreds") + (version "0.4.0") + (source + (origin + (method url-fetch) + (uri (pypi-uri "docker-pycreds" version)) + (sha256 + (base32 + "1m44smrggnqghxkqfl7vhapdw89m1p3vdr177r6cq17lr85jgqvc")))) + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'fix-versioning + (lambda _ + (substitute* "test-requirements.txt" + (("3.0.2") ,(package-version python-pytest)) + (("2.3.1") ,(package-version python-pytest-cov)) + (("2.4.1") ,(package-version python-flake8))) + #t))))) + (native-inputs + `(("python-flake8" ,python-flake8) + ("python-pytest" ,python-pytest) + ("python-pytest-cov" ,python-pytest-cov))) + (propagated-inputs + `(("python-six" ,python-six))) + (home-page "https://github.com/shin-/dockerpy-creds") + (synopsis + "Python bindings for the Docker credentials store API") + (description + "Docker-Pycreds contains the Python bindings for the docker credentials +store API. It allows programmers to interact with a Docker registry using +Python without keeping their credentials in a Docker configuration file.") + (license license:asl2.0))) + +(define-public containerd + (package + (name "containerd") + (version "1.2.5") + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/containerd/containerd.git") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 "0npbzixf3c0jvzm159vygvkydrr8h36c9sq50yv0mdinrys2bvg0")))) + (build-system go-build-system) + (arguments + `(#:import-path "github.com/containerd/containerd" + #:phases + (modify-phases %standard-phases + (add-before 'build 'chdir + (lambda _ + (chdir "src/github.com/containerd/containerd") + #t)) + (add-after 'chdir 'patch-paths + (lambda* (#:key inputs outputs #:allow-other-keys) + ;; TODO: Patch "socat", "unpigz". + (substitute* "./runtime/v1/linux/runtime.go" + (("defaultRuntime[ \t]*=.*") + (string-append "defaultRuntime = \"" + (assoc-ref inputs "runc") + "/sbin/runc\"\n")) + (("defaultShim[ \t]*=.*") + (string-append "defaultShim = \"" + (assoc-ref outputs "out") + "/bin/containerd-shim\"\n"))) + (substitute* "./vendor/github.com/containerd/go-runc/runc.go" + (("DefaultCommand[ \t]*=.*") + (string-append "DefaultCommand = \"" + (assoc-ref inputs "runc") + "/sbin/runc\"\n"))) + (substitute* "vendor/github.com/containerd/continuity/testutil/loopback/loopback_linux.go" + (("exec\\.Command\\(\"losetup\"") ; ) + (string-append "exec.Command(\"" + (assoc-ref inputs "util-linux") + "/sbin/losetup\""))) ;) + #t)) + (replace 'build + (lambda* (#:key (make-flags '()) #:allow-other-keys) + (apply invoke "make" make-flags))) + (replace 'install + (lambda* (#:key outputs (make-flags '()) #:allow-other-keys) + (let* ((out (assoc-ref outputs "out"))) + (apply invoke "make" (string-append "DESTDIR=" out) "install" + make-flags))))))) + (inputs + `(("btrfs-progs" ,btrfs-progs) + ("libseccomp" ,libseccomp) + ("runc" ,runc) + ("util-linux" ,util-linux))) + (native-inputs + `(("go" ,go) + ("pkg-config" ,pkg-config))) + (synopsis "Docker container runtime") + (description "This package provides the container daemon for Docker. +It includes image transfer and storage, container execution and supervision, +network attachments.") + (home-page "http://containerd.io/") + (license license:asl2.0))) + +;;; Private package that shouldn't be used directly; its purposes is to be +;;; used as a template for the various packages it contains. It doesn't build +;;; anyway, as it needs many dependencies that aren't being satisfied. +(define docker-libnetwork + ;; There are no recent release for libnetwork, so choose the last commit of + ;; the branch that Docker uses, as can be seen in the Docker source file + ;; 'hack/dockerfile/install/proxy.installer'. + (let ((commit "4725f2163fb214a6312f3beae5991f838ec36326") + (version "18.09") + (revision "1")) + (package + (name "docker-libnetwork") + (version (git-version version "1" commit)) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/docker/libnetwork.git") + (commit commit))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "1zpnxki8qfzha6ljahpwd3vkzmjhsvkmf73w6crm4ilxxw5vnpfb")) + ;; Delete bundled ("vendored") free software source code. + (modules '((guix build utils))) + (snippet '(begin + (delete-file-recursively "vendor") + #t)))) + (build-system go-build-system) + (arguments + `(#:import-path "github.com/docker/libnetwork/")) + (home-page "https://github.com/docker/libnetwork/") + (synopsis "Networking for containers") + (description "Libnetwork provides a native Go implementation for +connecting containers. The goal of @code{libnetwork} is to deliver a robust +container network model that provides a consistent programming interface and +the required network abstractions for applications.") + (license license:asl2.0)))) + +(define-public docker-libnetwork-cmd-proxy + (package + (inherit docker-libnetwork) + (name "docker-libnetwork-cmd-proxy") + (arguments + `(#:import-path "github.com/docker/libnetwork/cmd/proxy" + #:unpack-path "github.com/docker/libnetwork" + #:install-source? #f)) + (native-inputs + `(("go-sctp" ,go-sctp) + ;; For tests. + ("logrus" ,go-github-com-sirupsen-logrus) + ("go-netlink" ,go-netlink) + ("go-netns" ,go-netns) + ("go-golang-org-x-crypto" + ,go-golang-org-x-crypto) + ("go-golang-org-x-sys" ,go-golang-org-x-sys))) + (synopsis "Docker user-space proxy") + (description "A proxy running in the user space. It is used by the +built-in registry server of Docker.") + (license license:asl2.0))) + +;; TODO: Patch out modprobes for ip_vs, nf_conntrack, +;; brige, nf_conntrack_netlink, aufs. +(define-public docker + (package + (name "docker") + (version %docker-version) + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/docker/engine.git") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 "0cirpd9l2qazp2jyanwzvrkx2m98nksjdvn43ff38p89w6133ipb")) + (patches + (search-patches "docker-engine-test-noinstall.patch" + "docker-fix-tests.patch" + "docker-use-fewer-modprobes.patch" + "docker-adjust-tests-for-changes-in-go.patch")))) + (build-system gnu-build-system) + (arguments + `(#:modules + ((guix build gnu-build-system) + ((guix build go-build-system) #:prefix go:) + (guix build union) + (guix build utils)) + #:imported-modules + (,@%gnu-build-system-modules + (guix build union) + (guix build go-build-system)) + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch-paths + (lambda* (#:key inputs #:allow-other-keys) + (substitute* "builder/builder-next/executor_unix.go" + (("CommandCandidates:.*runc.*") + (string-append "CommandCandidates: []string{\"" + (assoc-ref inputs "runc") + "/sbin/runc\"},\n"))) + (substitute* "vendor/github.com/containerd/go-runc/runc.go" + (("DefaultCommand = .*") + (string-append "DefaultCommand = \"" + (assoc-ref inputs "runc") + "/sbin/runc\"\n"))) + (substitute* "vendor/github.com/containerd/containerd/runtime/v1/linux/runtime.go" + (("defaultRuntime[ \t]*=.*") + (string-append "defaultRuntime = \"" + (assoc-ref inputs "runc") + "/sbin/runc\"\n")) + (("defaultShim[ \t]*=.*") + (string-append "defaultShim = \"" + (assoc-ref inputs "containerd") + "/bin/containerd-shim\"\n"))) + (substitute* "daemon/daemon_unix.go" + (("DefaultShimBinary = .*") + (string-append "DefaultShimBinary = \"" + (assoc-ref inputs "containerd") + "/bin/containerd-shim\"\n")) + (("DefaultRuntimeBinary = .*") + (string-append "DefaultRuntimeBinary = \"" + (assoc-ref inputs "runc") + "/sbin/runc\"\n")) + (("DefaultRuntimeName = .*") + (string-append "DefaultRuntimeName = \"" + (assoc-ref inputs "runc") + "/sbin/runc\"\n"))) + (substitute* "daemon/config/config.go" + (("StockRuntimeName = .*") + (string-append "StockRuntimeName = \"" + (assoc-ref inputs "runc") + "/sbin/runc\"\n")) + (("DefaultInitBinary = .*") + (string-append "DefaultInitBinary = \"" + (assoc-ref inputs "tini") + "/bin/tini\"\n"))) + (substitute* "daemon/config/config_common_unix_test.go" + (("expectedInitPath: \"docker-init\"") + (string-append "expectedInitPath: \"" + (assoc-ref inputs "tini") + "/bin/tini\""))) + (substitute* "vendor/github.com/moby/buildkit/executor/runcexecutor/executor.go" + (("var defaultCommandCandidates = .*") + (string-append "var defaultCommandCandidates = []string{\"" + (assoc-ref inputs "runc") "/sbin/runc\"}"))) + (substitute* "vendor/github.com/docker/libnetwork/portmapper/proxy.go" + (("var userlandProxyCommandName = .*") + (string-append "var userlandProxyCommandName = \"" + (assoc-ref inputs "docker-proxy") + "/bin/proxy\"\n"))) + (substitute* "pkg/archive/archive.go" + (("string\\{\"xz") + (string-append "string{\"" (assoc-ref inputs "xz") "/bin/xz"))) + (let ((source-files (filter (lambda (name) + (not (string-contains name "test"))) + (find-files "." "\\.go$")))) + (let-syntax ((substitute-LookPath* + (syntax-rules () + ((_ (source-text package relative-path) ...) + (substitute* source-files + (((string-append "\\ .pc) + ("go" ,go) + ("pkg-config" ,pkg-config))) + (synopsis "Docker container component library, and daemon") + (description "This package provides a framework to assemble specialized +container systems. It includes components for orchestration, image +management, secret management, configuration management, networking, +provisioning etc.") + (home-page "https://mobyproject.org/") + (license license:asl2.0))) + +(define-public docker-cli + (package + (name "docker-cli") + (version %docker-version) + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/docker/cli.git") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 "0mxxjzkwdny8p2dmyjich7x1gn7hdlfppzjy2skk2k5bwv7nxpmi")))) + (build-system go-build-system) + (arguments + `(#:import-path "github.com/docker/cli" + ;; TODO: Tests require a running Docker daemon. + #:tests? #f + #:phases + (modify-phases %standard-phases + (add-before 'build 'setup-environment-2 + (lambda _ + ;; Respectively, strip the symbol table and debug + ;; information, and the DWARF symbol table. + (setenv "LDFLAGS" "-s -w") + + ;; Make sure "docker -v" prints a usable version string. + (setenv "VERSION" ,%docker-version) + + ;; Make build reproducible. + (setenv "BUILDTIME" "1970-01-01 00:00:01.000000000+00:00") + (symlink "src/github.com/docker/cli/scripts" "./scripts") + (symlink "src/github.com/docker/cli/docker.Makefile" "./docker.Makefile") + #t)) + (replace 'build + (lambda _ + (invoke "./scripts/build/dynbinary"))) + (replace 'check + (lambda* (#:key make-flags tests? #:allow-other-keys) + (setenv "PATH" (string-append (getcwd) "/build:" (getenv "PATH"))) + (if tests? + ;; Use the newly-built docker client for the tests. + (with-directory-excursion "src/github.com/docker/cli" + ;; TODO: Run test-e2e as well? + (apply invoke "make" "-f" "docker.Makefile" "test-unit" + (or make-flags '()))) + #t))) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (out-bin (string-append out "/bin")) + (etc (string-append out "/etc"))) + (with-directory-excursion "src/github.com/docker/cli/contrib/completion" + (install-file "bash/docker" + (string-append etc "/bash_completion.d")) + (install-file "fish/docker.fish" + (string-append etc "/fish/completions")) + (install-file "zsh/_docker" + (string-append etc "/zsh/site-functions"))) + (chdir "build") + (install-file "docker" out-bin) + #t)))))) + (native-inputs + `(("go" ,go) + ("libltdl" ,libltdl) + ("pkg-config" ,pkg-config))) + (synopsis "Command line interface to Docker") + (description "This package provides a command line interface to Docker.") + (home-page "https://www.docker.com/") + (license license:asl2.0))) + +(define-public cqfd + (package + (name "cqfd") + (version "5.1.0") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/savoirfairelinux/cqfd.git") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "1xhydz01f2rrnw7rmnaxh3f3q1ariq7j2ig0i0w1p3wn10l3q0nv")))) + (build-system gnu-build-system) + (arguments + ;; The test suite requires a docker daemon and connectivity. + `(#:tests? #f + #:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + ;; Fix the directory of the bash completion. + (substitute* "Makefile" + (("completionsdir=.*$") + (string-append "completionsdir=" out + "/etc/bash_completion.d; \\\n"))) + (invoke "make" "install" + (string-append "PREFIX=" out)))))))) + (home-page "https://github.com/savoirfairelinux/cqfd") + (synopsis "Convenience wrapper for Docker") + (description "cqfd is a Bash script that provides a quick and convenient +way to run commands in the current directory, but within a Docker container +defined in a per-project configuration file.") + (license license:gpl3+))) + +(define-public tini + (package + (name "tini") + (version "0.18.0") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/krallin/tini.git") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "1h20i3wwlbd8x4jr2gz68hgklh0lb0jj7y5xk1wvr8y58fip1rdn")))) + (build-system cmake-build-system) + (arguments + `(#:tests? #f ;tests require a Docker daemon + #:phases (modify-phases %standard-phases + (add-after 'unpack 'disable-static-build + ;; Disable the static build as it fails to install, with + ;; the error: "No valid ELF RPATH or RUNPATH entry exists + ;; in the file". + (lambda _ + (substitute* "CMakeLists.txt" + ((".*tini-static.*") "")) + #t))))) + (home-page "https://github.com/krallin/tini") + (synopsis "Tiny but valid init for containers") + (description "Tini is an init program specifically designed for use with +containers. It manages a single child process and ensures that any zombie +processes produced from it are reaped and that signals are properly forwarded. +Tini is integrated with Docker.") + (license license:expat)))