Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion cli-plugins/manager/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,21 @@ func (e errPluginNotFound) Error() string {
return "Error: No such CLI plugin: " + string(e)
}

// additionalSystemPluginDir is an optional system plugin directory that can be
// set at build time using -ldflags -X.
//
// For example: -X github.com/docker/cli/cli-plugins/manager.additionalSystemPluginDir=/path/to/cli-plugins
var additionalSystemPluginDir string

// getPluginDirs returns the platform-specific locations to search for plugins
// in order of preference.
//
// Plugin-discovery is performed in the following order of preference:
//
// 1. The "cli-plugins" directory inside the CLIs [config.Path] (usually "~/.docker/cli-plugins").
// 2. Additional plugin directories as configured through [ConfigFile.CLIPluginsExtraDirs].
// 3. Platform-specific defaultSystemPluginDirs.
// 3. The additional system plugin directory configured at build time.
// 4. Platform-specific defaultSystemPluginDirs.
//
// [ConfigFile.CLIPluginsExtraDirs]: https://pkg.go.dev/github.com/docker/cli@v26.1.4+incompatible/cli/config/configfile#ConfigFile.CLIPluginsExtraDirs
func getPluginDirs(cfg *configfile.ConfigFile) []string {
Expand All @@ -50,6 +57,9 @@ func getPluginDirs(cfg *configfile.ConfigFile) []string {
}
pluginDir := filepath.Join(config.Dir(), "cli-plugins")
pluginDirs = append(pluginDirs, pluginDir)
if additionalSystemPluginDir != "" {
pluginDirs = append(pluginDirs, additionalSystemPluginDir)
}
pluginDirs = append(pluginDirs, defaultSystemPluginDirs...)
return pluginDirs
}
Expand Down
13 changes: 13 additions & 0 deletions cli-plugins/manager/manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,12 @@ func TestGetPluginDirs(t *testing.T) {
cli := test.NewFakeCli(nil)

pluginDir := filepath.Join(config.Dir(), "cli-plugins")
originalAdditionalSystemPluginDir := additionalSystemPluginDir
additionalSystemPluginDir = ""
t.Cleanup(func() {
additionalSystemPluginDir = originalAdditionalSystemPluginDir
})

expected := append([]string{pluginDir}, defaultSystemPluginDirs...)

pluginDirs := getPluginDirs(cli.ConfigFile())
Expand All @@ -185,4 +191,11 @@ func TestGetPluginDirs(t *testing.T) {
})
pluginDirs = getPluginDirs(cli.ConfigFile())
assert.DeepEqual(t, expected, pluginDirs)

additionalSystemPluginDir = "qux"
expected = append([]string{}, extras...)
expected = append(expected, pluginDir, additionalSystemPluginDir)
expected = append(expected, defaultSystemPluginDirs...)
pluginDirs = getPluginDirs(cli.ConfigFile())
assert.DeepEqual(t, expected, pluginDirs)
}
3 changes: 2 additions & 1 deletion cli-plugins/manager/manager_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ package manager
//
// 1. The "cli-plugins" directory inside the CLIs config-directory (usually "~/.docker/cli-plugins").
// 2. Additional plugin directories as configured through [ConfigFile.CLIPluginsExtraDirs].
// 3. Platform-specific defaultSystemPluginDirs (as defined below).
// 3. The additional system plugin directory configured at build time.
// 4. 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{
Expand Down
3 changes: 2 additions & 1 deletion cli-plugins/manager/manager_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import (
//
// 1. The "cli-plugins" directory inside the CLIs config-directory (usually "~/.docker/cli-plugins").
// 2. Additional plugin directories as configured through [ConfigFile.CLIPluginsExtraDirs].
// 3. Platform-specific defaultSystemPluginDirs (as defined below).
// 3. The additional system plugin directory configured at build time.
// 4. 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{
Expand Down
Loading