@@ -18,12 +18,16 @@ package compose
18
18
19
19
import (
20
20
"context"
21
+ "os"
21
22
"os/exec"
23
+ "path/filepath"
22
24
23
25
"github.com/compose-spec/compose-go/v2/types"
24
26
"github.com/docker/cli/cli-plugins/metadata"
25
- "github.com/docker/cli/cli/context/docker"
27
+ "github.com/docker/cli/cli/command"
28
+ "github.com/docker/cli/cli/flags"
26
29
"github.com/docker/compose/v2/internal"
30
+ "github.com/docker/docker/client"
27
31
"go.opentelemetry.io/otel"
28
32
"go.opentelemetry.io/otel/propagation"
29
33
)
@@ -39,23 +43,44 @@ func (s *composeService) prepareShellOut(gctx context.Context, env types.Mapping
39
43
otel .GetTextMapPropagator ().Inject (gctx , & carrier )
40
44
env .Merge (types .Mapping (carrier ))
41
45
42
- env ["DOCKER_CONTEXT" ] = s .dockerCli .CurrentContext ()
46
+ cmd .Env = env .Values ()
47
+ return nil
48
+ }
49
+
50
+ // propagateDockerEndpoint produces DOCKER_* env vars for a child CLI plugin to target the same docker endpoint
51
+ // `cleanup` func MUST be called after child process completion to enforce removal of cert files
52
+ func (s * composeService ) propagateDockerEndpoint () ([]string , func (), error ) {
53
+ cleanup := func () {}
54
+ env := types.Mapping {}
55
+ env [command .EnvOverrideContext ] = s .dockerCli .CurrentContext ()
43
56
env ["USER_AGENT" ] = "compose/" + internal .Version
57
+ endpoint := s .dockerCli .DockerEndpoint ()
58
+ env [client .EnvOverrideHost ] = endpoint .Host
59
+ if endpoint .TLSData != nil {
60
+ certs , err := os .MkdirTemp ("" , "compose" )
61
+ if err != nil {
62
+ return nil , cleanup , err
63
+ }
64
+ cleanup = func () {
65
+ _ = os .RemoveAll (certs )
66
+ }
67
+ env [client .EnvOverrideCertPath ] = certs
68
+ if ! endpoint .SkipTLSVerify {
69
+ env [client .EnvTLSVerify ] = "1"
70
+ }
44
71
45
- md , err := s .dockerCli .ContextStore ().GetMetadata (s .dockerCli .CurrentContext ())
46
- if err != nil {
47
- return err
48
- }
49
- endpoint , err := docker .EndpointFromContext (md )
50
- if err != nil {
51
- return err
72
+ err = os .WriteFile (filepath .Join (certs , flags .DefaultKeyFile ), endpoint .TLSData .Key , 0o600 )
73
+ if err != nil {
74
+ return nil , cleanup , err
75
+ }
76
+ err = os .WriteFile (filepath .Join (certs , flags .DefaultCaFile ), endpoint .TLSData .Cert , 0o600 )
77
+ if err != nil {
78
+ return nil , cleanup , err
79
+ }
80
+ err = os .WriteFile (filepath .Join (certs , flags .DefaultCaFile ), endpoint .TLSData .CA , 0o600 )
81
+ if err != nil {
82
+ return nil , cleanup , err
83
+ }
52
84
}
53
- actualHost := s .dockerCli .DockerEndpoint ().Host
54
- if endpoint .Host != actualHost {
55
- // We are running with `--host` or `DOCKER_HOST` which overrides selected context
56
- env ["DOCKER_HOST" ] = actualHost
57
- }
58
-
59
- cmd .Env = env .Values ()
60
- return nil
85
+ return env .Values (), cleanup , nil
61
86
}
0 commit comments