@@ -18,12 +18,16 @@ package compose
1818
1919import (
2020 "context"
21+ "os"
2122 "os/exec"
23+ "path/filepath"
2224
2325 "github.com/compose-spec/compose-go/v2/types"
2426 "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"
2629 "github.com/docker/compose/v2/internal"
30+ "github.com/docker/docker/client"
2731 "go.opentelemetry.io/otel"
2832 "go.opentelemetry.io/otel/propagation"
2933)
@@ -39,23 +43,44 @@ func (s *composeService) prepareShellOut(gctx context.Context, env types.Mapping
3943 otel .GetTextMapPropagator ().Inject (gctx , & carrier )
4044 env .Merge (types .Mapping (carrier ))
4145
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 ()
4356 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+ }
4471
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+ }
5284 }
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
6186}
0 commit comments