@@ -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,43 @@ 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+ func (s * composeService ) propagateDockerEndpoint () ([]string , func (), error ) {
52+ cleanup := func () {}
53+ env := types.Mapping {}
54+ env [command .EnvOverrideContext ] = s .dockerCli .CurrentContext ()
4355 env ["USER_AGENT" ] = "compose/" + internal .Version
56+ endpoint := s .dockerCli .DockerEndpoint ()
57+ env [client .EnvOverrideHost ] = endpoint .Host
58+ if endpoint .TLSData != nil {
59+ certs , err := os .MkdirTemp ("" , "compose" )
60+ if err != nil {
61+ return nil , cleanup , err
62+ }
63+ cleanup = func () {
64+ _ = os .RemoveAll (certs )
65+ }
66+ env [client .EnvOverrideCertPath ] = certs
67+ if ! endpoint .SkipTLSVerify {
68+ env [client .EnvTLSVerify ] = "1"
69+ }
4470
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
71+ err = os .WriteFile (filepath .Join (certs , flags .DefaultKeyFile ), endpoint .TLSData .Key , 0o600 )
72+ if err != nil {
73+ return nil , cleanup , err
74+ }
75+ err = os .WriteFile (filepath .Join (certs , flags .DefaultCaFile ), endpoint .TLSData .Cert , 0o600 )
76+ if err != nil {
77+ return nil , cleanup , err
78+ }
79+ err = os .WriteFile (filepath .Join (certs , flags .DefaultCaFile ), endpoint .TLSData .CA , 0o600 )
80+ if err != nil {
81+ return nil , cleanup , err
82+ }
5283 }
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
84+ return env .Values (), cleanup , nil
6185}
0 commit comments