Skip to content

Commit e371fca

Browse files
authored
Merge pull request #842 from kish3007/cachefrom
Docker API update to 1.25 and support for cache-from command as part …
2 parents ec30edc + 05a9a74 commit e371fca

File tree

7 files changed

+88
-1
lines changed

7 files changed

+88
-1
lines changed

src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ public interface BuildImageCmd extends AsyncDockerCmd<BuildImageCmd, BuildRespon
5050
@CheckForNull
5151
Set<String> getTags();
5252

53+
/**
54+
* "Cache-from" in API
55+
*/
56+
@CheckForNull
57+
Set<String> getCacheFrom();
58+
5359
/**
5460
* "remote" in API
5561
*/
@@ -130,6 +136,11 @@ public interface BuildImageCmd extends AsyncDockerCmd<BuildImageCmd, BuildRespon
130136

131137
BuildImageCmd withTags(Set<String> tags);
132138

139+
/*
140+
* @since {@link RemoteApiVersion#VERSION_1_25}
141+
*/
142+
BuildImageCmd withCacheFrom(Set<String> cacheFrom);
143+
133144
BuildImageCmd withRemote(URI remote);
134145

135146
BuildImageCmd withBaseDirectory(File baseDirectory);

src/main/java/com/github/dockerjava/core/RemoteApiVersion.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ public class RemoteApiVersion implements Serializable {
7272
*/
7373
public static final RemoteApiVersion VERSION_1_24 = RemoteApiVersion.create(1, 24);
7474

75+
/*
76+
* @see <a href="https://docs.docker.com/engine/api/v1.25/">Docker API 1.25</a>
77+
*/
78+
public static final RemoteApiVersion VERSION_1_25 = RemoteApiVersion.create(1, 25);
79+
80+
7581
/**
7682
* Unknown, docker doesn't reflect reality. I.e. we implemented method, but for javadoc it not clear when it was added.
7783
*/

src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public class BuildImageCmdImpl extends AbstrAsyncDockerCmd<BuildImageCmd, BuildR
3030

3131
private Set<String> tags;
3232

33+
private Set<String> cacheFrom;
34+
3335
private Boolean noCache;
3436

3537
private Boolean remove = true;
@@ -99,6 +101,11 @@ public Set<String> getTags() {
99101
return tags;
100102
}
101103

104+
@CheckForNull
105+
public Set<String> getCacheFrom() {
106+
return cacheFrom;
107+
}
108+
102109
@Override
103110
public URI getRemote() {
104111
return remote;
@@ -209,6 +216,12 @@ public BuildImageCmd withTags(Set<String> tags) {
209216
return this;
210217
}
211218

219+
@Override
220+
public BuildImageCmd withCacheFrom(Set<String> cacheFrom) {
221+
this.cacheFrom = cacheFrom;
222+
return this;
223+
}
224+
212225
@Override
213226
public BuildImageCmd withRemote(URI remote) {
214227
this.remote = remote;

src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ protected AbstractCallbackNotifier<BuildResponseItem> callbackNotifier(BuildImag
7575
webTarget = webTarget.queryParam("t", command.getTag());
7676
}
7777

78+
if (command.getCacheFrom() != null) {
79+
for (String c: command.getCacheFrom()) {
80+
webTarget = webTarget.queryParam("cachefrom", c);
81+
}
82+
}
83+
7884
if (command.getRemote() != null) {
7985
webTarget = webTarget.queryParam("remote", command.getRemote().toString());
8086
}

src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,11 @@ protected Void execute0(BuildImageCmd command, ResultCallback<BuildResponseItem>
5555
if (command.getTags() != null && !command.getTags().isEmpty()) {
5656
webTarget = webTarget.queryParamsSet("t", command.getTags());
5757
} else if (isNotBlank(command.getTag())) {
58-
webTarget = webTarget.queryParam("t", command.getTags());
58+
webTarget = webTarget.queryParam("t", command.getTag());
59+
}
60+
61+
if (command.getCacheFrom() != null && !command.getCacheFrom().isEmpty()) {
62+
webTarget = webTarget.queryParamsSet("cachefrom", command.getCacheFrom());
5963
}
6064

6165
if (command.getRemote() != null) {

src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,30 @@ public void multipleTags() throws Exception {
312312
assertThat(inspectImageResponse.getRepoTags().size(), equalTo(2));
313313
assertThat(inspectImageResponse.getRepoTags(), containsInAnyOrder("docker-java-test:tag1", "docker-java-test:tag2"));
314314
}
315+
316+
@Test
317+
public void cacheFrom() throws Exception {
318+
if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_25)) {
319+
throw new SkipException("API version should be >= 1.25");
320+
}
321+
File baseDir1 = fileFromBuildTestResource("CacheFrom/test1");
322+
String imageId1 = dockerClient.buildImageCmd(baseDir1)
323+
.exec(new BuildImageResultCallback())
324+
.awaitImageId();
325+
InspectImageResponse inspectImageResponse1 = dockerClient.inspectImageCmd(imageId1).exec();
326+
assertThat(inspectImageResponse1, not(nullValue()));
327+
328+
File baseDir2 = fileFromBuildTestResource("CacheFrom/test2");
329+
String imageId2 = dockerClient.buildImageCmd(baseDir2).withCacheFrom(new HashSet<>(Arrays.asList(imageId1)))
330+
.exec(new BuildImageResultCallback())
331+
.awaitImageId();
332+
InspectImageResponse inspectImageResponse2 = dockerClient.inspectImageCmd(imageId2).exec();
333+
assertThat(inspectImageResponse2, not(nullValue()));
334+
335+
// Compare whether the image2's parent layer is from image1 so that cache is used
336+
assertThat(inspectImageResponse2.getParent(), equalTo(inspectImageResponse1.getId()));
337+
338+
}
315339

316340
public void dockerfileNotInBaseDirectory() throws Exception {
317341
File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory");

src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,29 @@ public void multipleTags() throws Exception {
318318
assertThat(inspectImageResponse.getRepoTags(), containsInAnyOrder("docker-java-test:tag1", "docker-java-test:tag2"));
319319
}
320320

321+
@Test
322+
public void cacheFrom() throws Exception {
323+
if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_25)) {
324+
throw new SkipException("API version should be >= 1.25");
325+
}
326+
File baseDir1 = fileFromBuildTestResource("CacheFrom/test1");
327+
String imageId1 = dockerClient.buildImageCmd(baseDir1)
328+
.exec(new BuildImageResultCallback())
329+
.awaitImageId();
330+
InspectImageResponse inspectImageResponse1 = dockerClient.inspectImageCmd(imageId1).exec();
331+
assertThat(inspectImageResponse1, not(nullValue()));
332+
333+
File baseDir2 = fileFromBuildTestResource("CacheFrom/test2");
334+
String imageId2 = dockerClient.buildImageCmd(baseDir2).withCacheFrom(new HashSet<>(Arrays.asList(imageId1)))
335+
.exec(new BuildImageResultCallback())
336+
.awaitImageId();
337+
InspectImageResponse inspectImageResponse2 = dockerClient.inspectImageCmd(imageId2).exec();
338+
assertThat(inspectImageResponse2, not(nullValue()));
339+
340+
// Compare whether the image2's parent layer is from image1 so that cache is used
341+
assertThat(inspectImageResponse2.getParent(), equalTo(inspectImageResponse1.getId()));
342+
}
343+
321344
public void dockerfileNotInBaseDirectory() throws Exception {
322345
File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory");
323346
File dockerfile = fileFromBuildTestResource("dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile");

0 commit comments

Comments
 (0)