2828import org .apache .commons .logging .Log ;
2929import org .apache .commons .logging .LogFactory ;
3030
31+ import org .springframework .boot .docker .compose .core .DockerCliCommand .ComposeVersion ;
3132import org .springframework .boot .docker .compose .core .DockerCliCommand .Type ;
3233import org .springframework .boot .logging .LogLevel ;
3334import org .springframework .core .log .LogMessage ;
@@ -52,6 +53,8 @@ class DockerCli {
5253
5354 private final DockerComposeOptions dockerComposeOptions ;
5455
56+ private final ComposeVersion composeVersion ;
57+
5558 /**
5659 * Create a new {@link DockerCli} instance.
5760 * @param workingDirectory the working directory or {@code null}
@@ -62,6 +65,7 @@ class DockerCli {
6265 this .dockerCommands = dockerCommandsCache .computeIfAbsent (workingDirectory ,
6366 (key ) -> new DockerCommands (this .processRunner ));
6467 this .dockerComposeOptions = (dockerComposeOptions != null ) ? dockerComposeOptions : DockerComposeOptions .none ();
68+ this .composeVersion = ComposeVersion .of (this .dockerCommands .get (Type .DOCKER_COMPOSE ).version ());
6569 }
6670
6771 /**
@@ -72,7 +76,7 @@ class DockerCli {
7276 */
7377 <R > R run (DockerCliCommand <R > dockerCommand ) {
7478 List <String > command = createCommand (dockerCommand .getType ());
75- command .addAll (dockerCommand .getCommand ());
79+ command .addAll (dockerCommand .getCommand (this . composeVersion ));
7680 Consumer <String > outputConsumer = createOutputConsumer (dockerCommand .getLogLevel ());
7781 String json = this .processRunner .run (outputConsumer , command .toArray (new String [0 ]));
7882 return dockerCommand .deserialize (json );
@@ -87,9 +91,9 @@ private Consumer<String> createOutputConsumer(LogLevel logLevel) {
8791
8892 private List <String > createCommand (Type type ) {
8993 return switch (type ) {
90- case DOCKER -> new ArrayList <>(this .dockerCommands .get (type ));
94+ case DOCKER -> new ArrayList <>(this .dockerCommands .get (type ). command () );
9195 case DOCKER_COMPOSE -> {
92- List <String > result = new ArrayList <>(this .dockerCommands .get (type ));
96+ List <String > result = new ArrayList <>(this .dockerCommands .get (type ). command () );
9397 DockerComposeFile composeFile = this .dockerComposeOptions .composeFile ();
9498 if (composeFile != null ) {
9599 for (File file : composeFile .getFiles ()) {
@@ -128,20 +132,20 @@ DockerComposeFile getDockerComposeFile() {
128132 */
129133 private static class DockerCommands {
130134
131- private final List < String > dockerCommand ;
135+ private final DockerCommand dockerCommand ;
132136
133- private final List < String > dockerComposeCommand ;
137+ private final DockerCommand dockerComposeCommand ;
134138
135139 DockerCommands (ProcessRunner processRunner ) {
136140 this .dockerCommand = getDockerCommand (processRunner );
137141 this .dockerComposeCommand = getDockerComposeCommand (processRunner );
138142 }
139143
140- private List < String > getDockerCommand (ProcessRunner processRunner ) {
144+ private DockerCommand getDockerCommand (ProcessRunner processRunner ) {
141145 try {
142146 String version = processRunner .run ("docker" , "version" , "--format" , "{{.Client.Version}}" );
143147 logger .trace (LogMessage .format ("Using docker %s" , version ));
144- return List .of ("docker" );
148+ return new DockerCommand ( version , List .of ("docker" ) );
145149 }
146150 catch (ProcessStartException ex ) {
147151 throw new DockerProcessStartException ("Unable to start docker process. Is docker correctly installed?" ,
@@ -156,13 +160,13 @@ private List<String> getDockerCommand(ProcessRunner processRunner) {
156160 }
157161 }
158162
159- private List < String > getDockerComposeCommand (ProcessRunner processRunner ) {
163+ private DockerCommand getDockerComposeCommand (ProcessRunner processRunner ) {
160164 try {
161165 DockerCliComposeVersionResponse response = DockerJson .deserialize (
162166 processRunner .run ("docker" , "compose" , "version" , "--format" , "json" ),
163167 DockerCliComposeVersionResponse .class );
164168 logger .trace (LogMessage .format ("Using Docker Compose %s" , response .version ()));
165- return List .of ("docker" , "compose" );
169+ return new DockerCommand ( response . version (), List .of ("docker" , "compose" ) );
166170 }
167171 catch (ProcessExitException ex ) {
168172 // Ignore and try docker-compose
@@ -172,7 +176,7 @@ private List<String> getDockerComposeCommand(ProcessRunner processRunner) {
172176 processRunner .run ("docker-compose" , "version" , "--format" , "json" ),
173177 DockerCliComposeVersionResponse .class );
174178 logger .trace (LogMessage .format ("Using docker-compose %s" , response .version ()));
175- return List .of ("docker-compose" );
179+ return new DockerCommand ( response . version (), List .of ("docker-compose" ) );
176180 }
177181 catch (ProcessStartException ex ) {
178182 throw new DockerProcessStartException (
@@ -181,7 +185,7 @@ private List<String> getDockerComposeCommand(ProcessRunner processRunner) {
181185 }
182186 }
183187
184- List < String > get (Type type ) {
188+ DockerCommand get (Type type ) {
185189 return switch (type ) {
186190 case DOCKER -> this .dockerCommand ;
187191 case DOCKER_COMPOSE -> this .dockerComposeCommand ;
@@ -190,6 +194,10 @@ List<String> get(Type type) {
190194
191195 }
192196
197+ private record DockerCommand (String version , List <String > command ) {
198+
199+ }
200+
193201 /**
194202 * Options for Docker Compose.
195203 *
@@ -198,6 +206,7 @@ List<String> get(Type type) {
198206 * @param arguments the arguments to pass to Docker Compose
199207 */
200208 record DockerComposeOptions (DockerComposeFile composeFile , Set <String > activeProfiles , List <String > arguments ) {
209+
201210 DockerComposeOptions {
202211 activeProfiles = (activeProfiles != null ) ? activeProfiles : Collections .emptySet ();
203212 arguments = (arguments != null ) ? arguments : Collections .emptyList ();
@@ -206,6 +215,7 @@ record DockerComposeOptions(DockerComposeFile composeFile, Set<String> activePro
206215 static DockerComposeOptions none () {
207216 return new DockerComposeOptions (null , null , null );
208217 }
218+
209219 }
210220
211221}
0 commit comments