28
28
import org .apache .commons .logging .Log ;
29
29
import org .apache .commons .logging .LogFactory ;
30
30
31
+ import org .springframework .boot .docker .compose .core .DockerCliCommand .ComposeVersion ;
31
32
import org .springframework .boot .docker .compose .core .DockerCliCommand .Type ;
32
33
import org .springframework .boot .logging .LogLevel ;
33
34
import org .springframework .core .log .LogMessage ;
@@ -52,6 +53,8 @@ class DockerCli {
52
53
53
54
private final DockerComposeOptions dockerComposeOptions ;
54
55
56
+ private final ComposeVersion composeVersion ;
57
+
55
58
/**
56
59
* Create a new {@link DockerCli} instance.
57
60
* @param workingDirectory the working directory or {@code null}
@@ -62,6 +65,7 @@ class DockerCli {
62
65
this .dockerCommands = dockerCommandsCache .computeIfAbsent (workingDirectory ,
63
66
(key ) -> new DockerCommands (this .processRunner ));
64
67
this .dockerComposeOptions = (dockerComposeOptions != null ) ? dockerComposeOptions : DockerComposeOptions .none ();
68
+ this .composeVersion = ComposeVersion .of (this .dockerCommands .get (Type .DOCKER_COMPOSE ).version ());
65
69
}
66
70
67
71
/**
@@ -72,7 +76,7 @@ class DockerCli {
72
76
*/
73
77
<R > R run (DockerCliCommand <R > dockerCommand ) {
74
78
List <String > command = createCommand (dockerCommand .getType ());
75
- command .addAll (dockerCommand .getCommand ());
79
+ command .addAll (dockerCommand .getCommand (this . composeVersion ));
76
80
Consumer <String > outputConsumer = createOutputConsumer (dockerCommand .getLogLevel ());
77
81
String json = this .processRunner .run (outputConsumer , command .toArray (new String [0 ]));
78
82
return dockerCommand .deserialize (json );
@@ -87,9 +91,9 @@ private Consumer<String> createOutputConsumer(LogLevel logLevel) {
87
91
88
92
private List <String > createCommand (Type type ) {
89
93
return switch (type ) {
90
- case DOCKER -> new ArrayList <>(this .dockerCommands .get (type ));
94
+ case DOCKER -> new ArrayList <>(this .dockerCommands .get (type ). command () );
91
95
case DOCKER_COMPOSE -> {
92
- List <String > result = new ArrayList <>(this .dockerCommands .get (type ));
96
+ List <String > result = new ArrayList <>(this .dockerCommands .get (type ). command () );
93
97
DockerComposeFile composeFile = this .dockerComposeOptions .composeFile ();
94
98
if (composeFile != null ) {
95
99
for (File file : composeFile .getFiles ()) {
@@ -128,20 +132,20 @@ DockerComposeFile getDockerComposeFile() {
128
132
*/
129
133
private static class DockerCommands {
130
134
131
- private final List < String > dockerCommand ;
135
+ private final DockerCommand dockerCommand ;
132
136
133
- private final List < String > dockerComposeCommand ;
137
+ private final DockerCommand dockerComposeCommand ;
134
138
135
139
DockerCommands (ProcessRunner processRunner ) {
136
140
this .dockerCommand = getDockerCommand (processRunner );
137
141
this .dockerComposeCommand = getDockerComposeCommand (processRunner );
138
142
}
139
143
140
- private List < String > getDockerCommand (ProcessRunner processRunner ) {
144
+ private DockerCommand getDockerCommand (ProcessRunner processRunner ) {
141
145
try {
142
146
String version = processRunner .run ("docker" , "version" , "--format" , "{{.Client.Version}}" );
143
147
logger .trace (LogMessage .format ("Using docker %s" , version ));
144
- return List .of ("docker" );
148
+ return new DockerCommand ( version , List .of ("docker" ) );
145
149
}
146
150
catch (ProcessStartException ex ) {
147
151
throw new DockerProcessStartException ("Unable to start docker process. Is docker correctly installed?" ,
@@ -156,13 +160,13 @@ private List<String> getDockerCommand(ProcessRunner processRunner) {
156
160
}
157
161
}
158
162
159
- private List < String > getDockerComposeCommand (ProcessRunner processRunner ) {
163
+ private DockerCommand getDockerComposeCommand (ProcessRunner processRunner ) {
160
164
try {
161
165
DockerCliComposeVersionResponse response = DockerJson .deserialize (
162
166
processRunner .run ("docker" , "compose" , "version" , "--format" , "json" ),
163
167
DockerCliComposeVersionResponse .class );
164
168
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" ) );
166
170
}
167
171
catch (ProcessExitException ex ) {
168
172
// Ignore and try docker-compose
@@ -172,7 +176,7 @@ private List<String> getDockerComposeCommand(ProcessRunner processRunner) {
172
176
processRunner .run ("docker-compose" , "version" , "--format" , "json" ),
173
177
DockerCliComposeVersionResponse .class );
174
178
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" ) );
176
180
}
177
181
catch (ProcessStartException ex ) {
178
182
throw new DockerProcessStartException (
@@ -181,7 +185,7 @@ private List<String> getDockerComposeCommand(ProcessRunner processRunner) {
181
185
}
182
186
}
183
187
184
- List < String > get (Type type ) {
188
+ DockerCommand get (Type type ) {
185
189
return switch (type ) {
186
190
case DOCKER -> this .dockerCommand ;
187
191
case DOCKER_COMPOSE -> this .dockerComposeCommand ;
@@ -190,6 +194,10 @@ List<String> get(Type type) {
190
194
191
195
}
192
196
197
+ private record DockerCommand (String version , List <String > command ) {
198
+
199
+ }
200
+
193
201
/**
194
202
* Options for Docker Compose.
195
203
*
@@ -198,6 +206,7 @@ List<String> get(Type type) {
198
206
* @param arguments the arguments to pass to Docker Compose
199
207
*/
200
208
record DockerComposeOptions (DockerComposeFile composeFile , Set <String > activeProfiles , List <String > arguments ) {
209
+
201
210
DockerComposeOptions {
202
211
activeProfiles = (activeProfiles != null ) ? activeProfiles : Collections .emptySet ();
203
212
arguments = (arguments != null ) ? arguments : Collections .emptyList ();
@@ -206,6 +215,7 @@ record DockerComposeOptions(DockerComposeFile composeFile, Set<String> activePro
206
215
static DockerComposeOptions none () {
207
216
return new DockerComposeOptions (null , null , null );
208
217
}
218
+
209
219
}
210
220
211
221
}
0 commit comments