@@ -24,6 +24,7 @@ import (
2424 "os/signal"
2525 "path/filepath"
2626 "regexp"
27+ "runtime"
2728
2829 "github.com/docker/compose/v2/pkg/compose"
2930 "github.com/docker/compose/v2/pkg/utils"
@@ -38,7 +39,13 @@ import (
3839var delegatedContextTypes = []string {store .DefaultContextType }
3940
4041// ComDockerCli name of the classic cli binary
41- const ComDockerCli = "com.docker.cli"
42+ var ComDockerCli = "com.docker.cli"
43+
44+ func init () {
45+ if runtime .GOOS == "windows" {
46+ ComDockerCli += ".exe"
47+ }
48+ }
4249
4350// ExecIfDefaultCtxType delegates to com.docker.cli if on moby context
4451func ExecIfDefaultCtxType (ctx context.Context , root * cobra.Command ) {
@@ -92,16 +99,7 @@ func Exec(root *cobra.Command) {
9299
93100// RunDocker runs a docker command, and forward signals to the shellout command (stops listening to signals when an event is sent to childExit)
94101func RunDocker (childExit chan bool , args ... string ) error {
95- execBinary , err := resolvepath .LookPath (ComDockerCli )
96- if err != nil {
97- execBinary = findBinary (ComDockerCli )
98- if execBinary == "" {
99- fmt .Fprintln (os .Stderr , err )
100- fmt .Fprintln (os .Stderr , "Current PATH : " + os .Getenv ("PATH" ))
101- os .Exit (1 )
102- }
103- }
104- cmd := exec .Command (execBinary , args ... )
102+ cmd := exec .Command (comDockerCli (), args ... )
105103 cmd .Stdin = os .Stdin
106104 cmd .Stdout = os .Stdout
107105 cmd .Stderr = os .Stderr
@@ -131,6 +129,25 @@ func RunDocker(childExit chan bool, args ...string) error {
131129 return cmd .Run ()
132130}
133131
132+ func comDockerCli () string {
133+ if v := os .Getenv ("DOCKER_COM_DOCKER_CLI" ); v != "" {
134+ return v
135+ }
136+
137+ execBinary := findBinary (ComDockerCli )
138+ if execBinary == "" {
139+ var err error
140+ execBinary , err = resolvepath .LookPath (ComDockerCli )
141+ if err != nil {
142+ fmt .Fprintln (os .Stderr , err )
143+ fmt .Fprintln (os .Stderr , "Current PATH : " + os .Getenv ("PATH" ))
144+ os .Exit (1 )
145+ }
146+ }
147+
148+ return execBinary
149+ }
150+
134151func findBinary (filename string ) string {
135152 currentBinaryPath , err := os .Executable ()
136153 if err != nil {
@@ -149,7 +166,7 @@ func findBinary(filename string) string {
149166
150167// IsDefaultContextCommand checks if the command exists in the classic cli (issues a shellout --help)
151168func IsDefaultContextCommand (dockerCommand string ) bool {
152- cmd := exec .Command (ComDockerCli , dockerCommand , "--help" )
169+ cmd := exec .Command (comDockerCli () , dockerCommand , "--help" )
153170 b , e := cmd .CombinedOutput ()
154171 if e != nil {
155172 fmt .Println (e )
@@ -162,7 +179,7 @@ func ExecSilent(ctx context.Context, args ...string) ([]byte, error) {
162179 if len (args ) == 0 {
163180 args = os .Args [1 :]
164181 }
165- cmd := exec .CommandContext (ctx , ComDockerCli , args ... )
182+ cmd := exec .CommandContext (ctx , comDockerCli () , args ... )
166183 cmd .Stderr = os .Stderr
167184 return cmd .Output ()
168185}
0 commit comments