From af225d5d72bbe2821447f126d148a99d7b658a4d Mon Sep 17 00:00:00 2001 From: John Ott Date: Fri, 28 Nov 2025 15:56:03 -0800 Subject: [PATCH] docker-compose: fix loading buildx plugin --- .../cli-system-plugin-dir-from-env.patch | 31 +++++++++++++++++++ .../virtualization/docker/compose.nix | 6 +++- .../virtualization/docker/default.nix | 18 +++++------ 3 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 pkgs/applications/virtualization/docker/cli-system-plugin-dir-from-env.patch diff --git a/pkgs/applications/virtualization/docker/cli-system-plugin-dir-from-env.patch b/pkgs/applications/virtualization/docker/cli-system-plugin-dir-from-env.patch new file mode 100644 index 000000000000..4e0705df3b2d --- /dev/null +++ b/pkgs/applications/virtualization/docker/cli-system-plugin-dir-from-env.patch @@ -0,0 +1,31 @@ +diff --git a/cli-plugins/manager/manager_unix.go b/cli-plugins/manager/manager_unix.go +index f546dc3849..5e3ae08dbc 100644 +--- a/cli-plugins/manager/manager_unix.go ++++ b/cli-plugins/manager/manager_unix.go +@@ -2,6 +2,11 @@ + + package manager + ++import ( ++ "os" ++ "path/filepath" ++) ++ + // defaultSystemPluginDirs are the platform-specific locations to search + // for plugins in order of preference. + // +@@ -12,9 +17,8 @@ + // 3. Platform-specific defaultSystemPluginDirs (as defined below). + // + // [ConfigFile.CLIPluginsExtraDirs]: https://pkg.go.dev/github.com/docker/cli@v26.1.4+incompatible/cli/config/configfile#ConfigFile.CLIPluginsExtraDirs +-var defaultSystemPluginDirs = []string{ +- "/usr/local/lib/docker/cli-plugins", +- "/usr/local/libexec/docker/cli-plugins", +- "/usr/lib/docker/cli-plugins", +- "/usr/libexec/docker/cli-plugins", ++var defaultSystemPluginDirs []string ++ ++func init() { ++ defaultSystemPluginDirs = filepath.SplitList(os.Getenv("DOCKER_CLI_PLUGIN_DIRS")) + } + diff --git a/pkgs/applications/virtualization/docker/compose.nix b/pkgs/applications/virtualization/docker/compose.nix index e7bb654d8ba0..a9b33e10056b 100644 --- a/pkgs/applications/virtualization/docker/compose.nix +++ b/pkgs/applications/virtualization/docker/compose.nix @@ -15,7 +15,11 @@ buildGoModule rec { hash = "sha256-7g9l9SBxPY3jMS3DWZNI/fhOZN1oZo1qkUfhMfbzAaM="; }; - vendorHash = "sha256-COfB0MLBMOfTdLbpShBkMOEule/1cu6Bo5lm1ieO/nA="; + vendorHash = "sha256-EFbEd1UwrBnH6pSh+MvupYdie8SnKr8y6K9lQflBSlk="; + + modPostBuild = '' + patch -d vendor/github.com/docker/cli/ -p1 < ${./cli-system-plugin-dir-from-env.patch} + ''; ldflags = [ "-X github.com/docker/compose/v2/internal.Version=${version}" diff --git a/pkgs/applications/virtualization/docker/default.nix b/pkgs/applications/virtualization/docker/default.nix index 06bb07268c07..4ebc458e2fa9 100644 --- a/pkgs/applications/virtualization/docker/default.nix +++ b/pkgs/applications/virtualization/docker/default.nix @@ -259,10 +259,9 @@ let ++ lib.optionals sbomSupport [ docker-sbom ] ++ lib.optionals initSupport [ docker-init ]; - pluginsRef = symlinkJoin { - name = "docker-plugins"; - paths = plugins; - }; + dockerCliPluginsDirs = lib.strings.concatStringsSep ":" ( + map (p: "${p}/libexec/docker/cli-plugins") plugins + ); in buildGoModule ( { @@ -278,6 +277,10 @@ let hash = cliHash; }; + patches = [ + ./cli-system-plugin-dir-from-env.patch + ]; + vendorHash = null; nativeBuildInputs = [ @@ -299,10 +302,6 @@ let postPatch = '' patchShebangs man scripts/build/ substituteInPlace ./scripts/build/.variables --replace-fail "set -eu" "" - '' - + lib.optionalString (plugins != [ ]) '' - substituteInPlace ./cli-plugins/manager/manager_unix.go --replace-fail /usr/libexec/docker/cli-plugins \ - "${pluginsRef}/libexec/docker/cli-plugins" ''; # Keep eyes on BUILDTIME format - https://github.com/docker/cli/blob/${version}/scripts/build/.variables @@ -331,7 +330,8 @@ let install -Dm755 ./build/docker $out/libexec/docker/docker makeWrapper $out/libexec/docker/docker $out/bin/docker \ - --prefix PATH : "$out/libexec/docker:$extraPath" + --prefix PATH : "$out/libexec/docker:$extraPath" \ + --prefix DOCKER_CLI_PLUGIN_DIRS : "${dockerCliPluginsDirs}" '' + lib.optionalString (!clientOnly) '' # symlink docker daemon to docker cli derivation