37
37
import java .util .Optional ;
38
38
import java .util .Set ;
39
39
import java .util .function .Consumer ;
40
+ import java .util .regex .Matcher ;
40
41
import java .util .zip .GZIPOutputStream ;
41
42
42
43
@ Slf4j
@@ -96,6 +97,7 @@ public ImageFromDockerfile withFileFromTransferable(String path, Transferable tr
96
97
protected final String resolve () {
97
98
Logger logger = DockerLoggerFactory .getLogger (dockerImageName );
98
99
100
+ //noinspection resource
99
101
DockerClient dockerClient = DockerClientFactory .instance ().client ();
100
102
101
103
try {
@@ -107,12 +109,12 @@ public void onNext(BuildResponseItem item) {
107
109
if (item .isErrorIndicated ()) {
108
110
logger .error (item .getErrorDetail ().getMessage ());
109
111
} else {
110
- logger .debug (StringUtils .chomp (item .getStream (), "\n " ));
112
+ logger .debug (StringUtils .removeEnd (item .getStream (), "\n " ));
111
113
}
112
114
}
113
115
};
114
116
115
- // We have to use pipes to avoid high memory consumption since users might want to build really big images
117
+ // We have to use pipes to avoid high memory consumption since users might want to build huge images
116
118
@ Cleanup
117
119
PipedInputStream in = new PipedInputStream ();
118
120
@ Cleanup
@@ -169,7 +171,7 @@ public void onNext(BuildResponseItem item) {
169
171
}
170
172
171
173
protected void configure (BuildImageCmd buildImageCmd ) {
172
- buildImageCmd .withTag ( this . getDockerImageName ());
174
+ buildImageCmd .withTags ( Collections . singleton ( getDockerImageName () ));
173
175
this .dockerFilePath .ifPresent (buildImageCmd ::withDockerfilePath );
174
176
this .dockerfile .ifPresent (p -> {
175
177
buildImageCmd .withDockerfile (p .toFile ());
@@ -188,27 +190,40 @@ protected void configure(BuildImageCmd buildImageCmd) {
188
190
}
189
191
190
192
private void prePullDependencyImages (Set <String > imagesToPull ) {
191
- final DockerClient dockerClient = DockerClientFactory .instance ().client ();
192
-
193
193
imagesToPull .forEach (imageName -> {
194
+ String resolvedImageName = applyBuildArgsToImageName (imageName );
194
195
try {
195
196
log .info (
196
197
"Pre-emptively checking local images for '{}', referenced via a Dockerfile. If not available, it will be pulled." ,
197
- imageName
198
+ resolvedImageName
198
199
);
199
- new RemoteDockerImage (DockerImageName .parse (imageName ))
200
+ new RemoteDockerImage (DockerImageName .parse (resolvedImageName ))
200
201
.withImageNameSubstitutor (ImageNameSubstitutor .noop ())
201
202
.get ();
202
203
} catch (Exception e ) {
203
204
log .warn (
204
205
"Unable to pre-fetch an image ({}) depended upon by Dockerfile - image build will continue but may fail. Exception message was: {}" ,
205
- imageName ,
206
+ resolvedImageName ,
206
207
e .getMessage ()
207
208
);
208
209
}
209
210
});
210
211
}
211
212
213
+ /**
214
+ * See {@code filterForEnvironmentVars()} in {@link com.github.dockerjava.core.dockerfile.DockerfileStatement}.
215
+ */
216
+ private String applyBuildArgsToImageName (String imageName ) {
217
+ for (Map .Entry <String , String > entry : buildArgs .entrySet ()) {
218
+ String value = Matcher .quoteReplacement (entry .getValue ());
219
+ // handle: $VARIABLE case
220
+ imageName = imageName .replace ("$" + entry .getKey (), value );
221
+ // handle ${VARIABLE} case
222
+ imageName = imageName .replace ("${" + entry .getKey () + "}" , value );
223
+ }
224
+ return imageName ;
225
+ }
226
+
212
227
public ImageFromDockerfile withBuildArg (final String key , final String value ) {
213
228
this .buildArgs .put (key , value );
214
229
return this ;
0 commit comments