@@ -215,6 +215,9 @@ type composeService struct {
215215 clock clockwork.Clock
216216 maxConcurrency int
217217 dryRun bool
218+
219+ runtimeVersion runtimeVersionCache
220+ currentAPIVersion runtimeVersionCache
218221}
219222
220223// Close releases any connections/resources held by the underlying clients.
@@ -497,16 +500,42 @@ type runtimeVersionCache struct {
497500 err error
498501}
499502
500- var runtimeVersion runtimeVersionCache
501-
502503func (s * composeService ) RuntimeVersion (ctx context.Context ) (string , error ) {
503- // TODO(thaJeztah): this should use Client.ClientVersion), which has the negotiated version.
504- runtimeVersion .once .Do (func () {
504+ // RuntimeVersion returns the raw API version reported by the daemon.
505+ // Callers that need the negotiated/effective client API version should use
506+ // CurrentAPIVersion instead.
507+ s .runtimeVersion .once .Do (func () {
505508 version , err := s .apiClient ().ServerVersion (ctx , client.ServerVersionOptions {})
506509 if err != nil {
507- runtimeVersion .err = err
510+ s .runtimeVersion .err = err
511+ return
508512 }
509- runtimeVersion .val = version .APIVersion
513+ s . runtimeVersion .val = version .APIVersion
510514 })
511- return runtimeVersion .val , runtimeVersion .err
515+ return s .runtimeVersion .val , s .runtimeVersion .err
516+ }
517+
518+ // CurrentAPIVersion returns the API version currently used by the Docker client.
519+ // Trigger negotiation first so version-gated request shaping matches the version
520+ // that subsequent API calls will actually use.
521+ func (s * composeService ) CurrentAPIVersion (ctx context.Context ) (string , error ) {
522+ s .currentAPIVersion .once .Do (func () {
523+ _ , err := s .apiClient ().Ping (ctx , client.PingOptions {NegotiateAPIVersion : true })
524+ if err != nil {
525+ s .currentAPIVersion .err = err
526+ return
527+ }
528+
529+ version := s .apiClient ().ClientVersion ()
530+ if version != "" {
531+ s .currentAPIVersion .val = version
532+ return
533+ }
534+
535+ // Defensive fallback for unexpected client implementations or mocks that
536+ // do not populate ClientVersion after a successful negotiated ping.
537+ s .currentAPIVersion .val , s .currentAPIVersion .err = s .RuntimeVersion (ctx )
538+ })
539+
540+ return s .currentAPIVersion .val , s .currentAPIVersion .err
512541}
0 commit comments