Skip to content

Commit 00af9b7

Browse files
committed
feat: add support for dockerd Builder-Version header
* in docker 23 dockerd introduced the 'Builder-Version' header to expose the recommended version of the builder backend * it is up to the client to follow this recommendation * dockerd uses the deprecated 'classic builder' if clients do not set the 'version' build option explicitly * d-m-p should always set the 'version' option as recommended by the dockerd Refs: #1711
1 parent ac5e09a commit 00af9b7

File tree

4 files changed

+33
-0
lines changed

4 files changed

+33
-0
lines changed

src/main/java/io/fabric8/maven/docker/access/BuildOptions.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@ public BuildOptions addOption(String key, String value) {
4343
return this;
4444
}
4545

46+
public BuildOptions builderVersion(String version) {
47+
if (version != null) {
48+
options.put("version", version);
49+
}
50+
return this;
51+
}
52+
4653
public BuildOptions dockerfile(String name) {
4754
if (name != null) {
4855
options.put("dockerfile", name);

src/main/java/io/fabric8/maven/docker/access/DockerAccess.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ public interface DockerAccess {
4242
*/
4343
String getServerApiVersion() throws DockerAccessException;
4444

45+
/**
46+
* Get the builder version recommended by the daemon (see 'Builder-Version' response header of '/_ping' API)
47+
*
48+
* @return the recommended builder version or 'null' if dockerd doesn't recommend any version
49+
*/
50+
String getDefaultBuilderVersion();
51+
4552
/**
4653
* Get the native platform
4754
* @return The platform os/arch

src/main/java/io/fabric8/maven/docker/access/hc/DockerAccessWithHcClient.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import io.fabric8.maven.docker.access.CreateImageOptions;
2121
import org.apache.commons.io.IOUtils;
22+
import org.apache.http.Header;
2223
import org.apache.http.HttpResponse;
2324
import org.apache.http.client.HttpResponseException;
2425
import org.apache.http.client.ResponseHandler;
@@ -111,6 +112,7 @@ public class DockerAccessWithHcClient implements DockerAccess {
111112

112113
private final ApacheHttpClientDelegate delegate;
113114
private final String apiVersion;
115+
private final String defaultBuilderVersion;
114116
private final String nativePlatform;
115117
private final UrlBuilder urlBuilder;
116118

@@ -149,6 +151,14 @@ public DockerAccessWithHcClient(@Nonnull String baseUrl,
149151
this.nativePlatform = info.get("Os").getAsString() + "/" + info.get("Arch").getAsString();
150152
this.urlBuilder = new UrlBuilder(baseUrl, "v" + apiVersion);
151153
this.log = log;
154+
String pingUrl = baseUrl + "/_ping";
155+
defaultBuilderVersion = delegate.get(pingUrl, response -> {
156+
Header[] builderVersionHeaders = response.getHeaders("Builder-Version");
157+
if (null != builderVersionHeaders && 0 < builderVersionHeaders.length) {
158+
return builderVersionHeaders[0].getValue();
159+
}
160+
return null;
161+
}, HTTP_OK);
152162
}
153163

154164
static String stripTrailingSlash(String url) {
@@ -165,6 +175,11 @@ public String getServerApiVersion() {
165175
return apiVersion;
166176
}
167177

178+
@Override
179+
public String getDefaultBuilderVersion() {
180+
return defaultBuilderVersion;
181+
}
182+
168183
@Override
169184
public void startExecContainer(String containerId, LogOutputSpec outputSpec) throws DockerAccessException {
170185
String url = urlBuilder.startExecContainer(containerId);

src/main/java/io/fabric8/maven/docker/service/BuildService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,13 @@ protected void buildImage(ImageConfiguration imageConfig, MojoParameters params,
172172

173173
Map<String, String> mergedBuildMap = prepareBuildArgs(buildArgs, buildConfig);
174174

175+
String builderVersion = null != buildConfig.getBuildOptions()
176+
? buildConfig.getBuildOptions().getOrDefault("version", docker.getDefaultBuilderVersion()) // use configured version …
177+
: docker.getDefaultBuilderVersion(); // … or use the default version
175178
// auto is now supported by docker, consider switching?
176179
BuildOptions opts =
177180
new BuildOptions(buildConfig.getBuildOptions())
181+
.builderVersion(builderVersion)
178182
.dockerfile(buildConfig.getDockerfileName())
179183
.forceRemove(cleanupMode.isRemove())
180184
.noCache(noCache)

0 commit comments

Comments
 (0)