Skip to content

Commit 8a98a61

Browse files
committed
Add support to get the history of an image
1 parent ea48fd6 commit 8a98a61

File tree

13 files changed

+384
-0
lines changed

13 files changed

+384
-0
lines changed

docker-java-api/src/main/java/com/github/dockerjava/api/DockerClient.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.github.dockerjava.api.command.InspectContainerCmd;
2727
import com.github.dockerjava.api.command.InspectExecCmd;
2828
import com.github.dockerjava.api.command.InspectImageCmd;
29+
import com.github.dockerjava.api.command.ImageHistoryCmd;
2930
import com.github.dockerjava.api.command.InspectNetworkCmd;
3031
import com.github.dockerjava.api.command.InspectServiceCmd;
3132
import com.github.dockerjava.api.command.InspectSwarmCmd;
@@ -142,6 +143,8 @@ public interface DockerClient extends Closeable {
142143

143144
InspectImageCmd inspectImageCmd(@Nonnull String imageId);
144145

146+
ImageHistoryCmd imageHistoryCmd(@Nonnull String imageId);
147+
145148
/**
146149
* @param name
147150
* The name, e.g. "alexec/busybox" or just "busybox" if you want to default. Not null.

docker-java-api/src/main/java/com/github/dockerjava/api/DockerClientDelegate.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.github.dockerjava.api.command.InspectContainerCmd;
2727
import com.github.dockerjava.api.command.InspectExecCmd;
2828
import com.github.dockerjava.api.command.InspectImageCmd;
29+
import com.github.dockerjava.api.command.ImageHistoryCmd;
2930
import com.github.dockerjava.api.command.InspectNetworkCmd;
3031
import com.github.dockerjava.api.command.InspectServiceCmd;
3132
import com.github.dockerjava.api.command.InspectSwarmCmd;
@@ -179,6 +180,11 @@ public InspectImageCmd inspectImageCmd(@Nonnull String imageId) {
179180
return getDockerClient().inspectImageCmd(imageId);
180181
}
181182

183+
@Override
184+
public ImageHistoryCmd imageHistoryCmd(@Nonnull String imageId) {
185+
return getDockerClient().imageHistoryCmd(imageId);
186+
}
187+
182188
@Override
183189
public SaveImageCmd saveImageCmd(@Nonnull String name) {
184190
return getDockerClient().saveImageCmd(name);

docker-java-api/src/main/java/com/github/dockerjava/api/command/DelegatingDockerCmdExecFactory.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@ public InspectImageCmd.Exec createInspectImageCmdExec() {
100100
return getDockerCmdExecFactory().createInspectImageCmdExec();
101101
}
102102

103+
@Override
104+
public ImageHistoryCmd.Exec createImageHistoryCmdExec() {
105+
return getDockerCmdExecFactory().createImageHistoryCmdExec();
106+
}
107+
103108
@Override
104109
public ListContainersCmd.Exec createListContainersCmdExec() {
105110
return getDockerCmdExecFactory().createListContainersCmdExec();

docker-java-api/src/main/java/com/github/dockerjava/api/command/DockerCmdExecFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public interface DockerCmdExecFactory extends Closeable {
3737

3838
InspectImageCmd.Exec createInspectImageCmdExec();
3939

40+
ImageHistoryCmd.Exec createImageHistoryCmdExec();
41+
4042
ListContainersCmd.Exec createListContainersCmdExec();
4143

4244
CreateContainerCmd.Exec createCreateContainerCmdExec();
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.github.dockerjava.api.command;
2+
3+
import java.util.List;
4+
5+
import javax.annotation.CheckForNull;
6+
import javax.annotation.Nonnull;
7+
8+
import com.github.dockerjava.api.exception.NotFoundException;
9+
import com.github.dockerjava.api.model.ImageHistory;
10+
11+
/**
12+
* Get the history of an image.
13+
*/
14+
public interface ImageHistoryCmd extends SyncDockerCmd<List<ImageHistory>> {
15+
16+
@CheckForNull
17+
String getImageId();
18+
19+
ImageHistoryCmd withImageId(@Nonnull String imageId);
20+
21+
/**
22+
* @throws NotFoundException
23+
* No such image
24+
*/
25+
@Override
26+
List<ImageHistory> exec() throws NotFoundException;
27+
28+
interface Exec extends DockerCmdSyncExec<ImageHistoryCmd, List<ImageHistory>> {
29+
}
30+
31+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package com.github.dockerjava.api.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.EqualsAndHashCode;
5+
import lombok.ToString;
6+
7+
import javax.annotation.CheckForNull;
8+
import java.io.Serializable;
9+
import java.util.List;
10+
11+
/**
12+
* Represents an individual image layer information in response to the ImageHistory operation.
13+
*/
14+
@EqualsAndHashCode
15+
@ToString
16+
public class ImageHistory extends DockerObject implements Serializable {
17+
18+
@JsonProperty("Id")
19+
private String id;
20+
21+
@JsonProperty("Created")
22+
private Long created;
23+
24+
@JsonProperty("CreatedBy")
25+
private String createdBy;
26+
27+
@JsonProperty("Tags")
28+
private List<String> tags;
29+
30+
@JsonProperty("Size")
31+
private Long size;
32+
33+
@JsonProperty("Comment")
34+
private String comment;
35+
36+
@CheckForNull
37+
public String getId() {
38+
return id;
39+
}
40+
41+
public ImageHistory withId(String id) {
42+
this.id = id;
43+
return this;
44+
}
45+
46+
@CheckForNull
47+
public Long getCreated() {
48+
return created;
49+
}
50+
51+
public ImageHistory withCreated(Long created) {
52+
this.created = created;
53+
return this;
54+
}
55+
56+
@CheckForNull
57+
public String getCreatedBy() {
58+
return createdBy;
59+
}
60+
61+
public ImageHistory withCreatedBy(String createdBy) {
62+
this.createdBy = createdBy;
63+
return this;
64+
}
65+
66+
@CheckForNull
67+
public List<String> getTags() {
68+
return tags;
69+
}
70+
71+
public ImageHistory withTags(List<String> tags) {
72+
this.tags = tags;
73+
return this;
74+
}
75+
76+
@CheckForNull
77+
public Long getSize() {
78+
return size;
79+
}
80+
81+
public ImageHistory withSize(Long size) {
82+
this.size = size;
83+
return this;
84+
}
85+
86+
@CheckForNull
87+
public String getComment() {
88+
return comment;
89+
}
90+
91+
public ImageHistory withComment(String comment) {
92+
this.comment = comment;
93+
return this;
94+
}
95+
}

docker-java-core/src/main/java/com/github/dockerjava/core/AbstractDockerCmdExecFactory.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.github.dockerjava.api.command.InspectContainerCmd;
3030
import com.github.dockerjava.api.command.InspectExecCmd;
3131
import com.github.dockerjava.api.command.InspectImageCmd;
32+
import com.github.dockerjava.api.command.ImageHistoryCmd;
3233
import com.github.dockerjava.api.command.InspectNetworkCmd;
3334
import com.github.dockerjava.api.command.InspectServiceCmd;
3435
import com.github.dockerjava.api.command.InspectSwarmCmd;
@@ -113,6 +114,7 @@
113114
import com.github.dockerjava.core.exec.InspectContainerCmdExec;
114115
import com.github.dockerjava.core.exec.InspectExecCmdExec;
115116
import com.github.dockerjava.core.exec.InspectImageCmdExec;
117+
import com.github.dockerjava.core.exec.ImageHistoryCmdExec;
116118
import com.github.dockerjava.core.exec.InspectNetworkCmdExec;
117119
import com.github.dockerjava.core.exec.InspectServiceCmdExec;
118120
import com.github.dockerjava.core.exec.InspectSwarmCmdExec;
@@ -281,6 +283,11 @@ public InspectImageCmd.Exec createInspectImageCmdExec() {
281283
return new InspectImageCmdExec(getBaseResource(), getDockerClientConfig());
282284
}
283285

286+
@Override
287+
public ImageHistoryCmd.Exec createImageHistoryCmdExec() {
288+
return new ImageHistoryCmdExec(getBaseResource(), getDockerClientConfig());
289+
}
290+
284291
@Override
285292
public ListContainersCmd.Exec createListContainersCmdExec() {
286293
return new ListContainersCmdExec(getBaseResource(), getDockerClientConfig());

docker-java-core/src/main/java/com/github/dockerjava/core/DockerClientImpl.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.github.dockerjava.api.command.InspectContainerCmd;
2929
import com.github.dockerjava.api.command.InspectExecCmd;
3030
import com.github.dockerjava.api.command.InspectImageCmd;
31+
import com.github.dockerjava.api.command.ImageHistoryCmd;
3132
import com.github.dockerjava.api.command.InspectNetworkCmd;
3233
import com.github.dockerjava.api.command.InspectServiceCmd;
3334
import com.github.dockerjava.api.command.InspectSwarmCmd;
@@ -113,6 +114,7 @@
113114
import com.github.dockerjava.core.command.InspectContainerCmdImpl;
114115
import com.github.dockerjava.core.command.InspectExecCmdImpl;
115116
import com.github.dockerjava.core.command.InspectImageCmdImpl;
117+
import com.github.dockerjava.core.command.ImageHistoryCmdImpl;
116118
import com.github.dockerjava.core.command.InspectServiceCmdImpl;
117119
import com.github.dockerjava.core.command.InspectSwarmCmdImpl;
118120
import com.github.dockerjava.core.command.InspectVolumeCmdImpl;
@@ -375,6 +377,11 @@ public InspectImageCmd inspectImageCmd(String imageId) {
375377
return new InspectImageCmdImpl(getDockerCmdExecFactory().createInspectImageCmdExec(), imageId);
376378
}
377379

380+
@Override
381+
public ImageHistoryCmd imageHistoryCmd(String imageId) {
382+
return new ImageHistoryCmdImpl(getDockerCmdExecFactory().createImageHistoryCmdExec(), imageId);
383+
}
384+
378385
/**
379386
* * CONTAINER API *
380387
*/
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.github.dockerjava.core.command;
2+
3+
import java.util.List;
4+
import java.util.Objects;
5+
6+
import com.github.dockerjava.api.command.ImageHistoryCmd;
7+
import com.github.dockerjava.api.exception.NotFoundException;
8+
import com.github.dockerjava.api.model.ImageHistory;
9+
10+
/**
11+
* Get the history of an image.
12+
*/
13+
public class ImageHistoryCmdImpl extends AbstrDockerCmd<ImageHistoryCmd, List<ImageHistory>> implements
14+
ImageHistoryCmd {
15+
16+
private String imageId;
17+
18+
public ImageHistoryCmdImpl(ImageHistoryCmd.Exec exec, String imageId) {
19+
super(exec);
20+
withImageId(imageId);
21+
}
22+
23+
@Override
24+
public String getImageId() {
25+
return imageId;
26+
}
27+
28+
@Override
29+
public ImageHistoryCmd withImageId(String imageId) {
30+
this.imageId = Objects.requireNonNull(imageId, "imageId was not specified");
31+
return this;
32+
}
33+
34+
/**
35+
* @throws NotFoundException
36+
* No such image
37+
*/
38+
@Override
39+
public List<ImageHistory> exec() throws NotFoundException {
40+
return super.exec();
41+
}
42+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.github.dockerjava.core.exec;
2+
3+
import java.util.List;
4+
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
8+
import com.fasterxml.jackson.core.type.TypeReference;
9+
import com.github.dockerjava.api.command.ImageHistoryCmd;
10+
import com.github.dockerjava.api.model.ImageHistory;
11+
import com.github.dockerjava.core.DockerClientConfig;
12+
import com.github.dockerjava.core.MediaType;
13+
import com.github.dockerjava.core.WebTarget;
14+
15+
public class ImageHistoryCmdExec extends AbstrSyncDockerCmdExec<ImageHistoryCmd, List<ImageHistory>> implements
16+
ImageHistoryCmd.Exec {
17+
18+
private static final Logger LOGGER = LoggerFactory.getLogger(ImageHistoryCmdExec.class);
19+
20+
public ImageHistoryCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
21+
super(baseResource, dockerClientConfig);
22+
}
23+
24+
@Override
25+
protected List<ImageHistory> execute(ImageHistoryCmd command) {
26+
WebTarget webResource = getBaseResource().path("/images/{id}/history").resolveTemplate("id",
27+
command.getImageId());
28+
29+
LOGGER.trace("GET: {}", webResource);
30+
31+
return webResource.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference<List<ImageHistory>>() {
32+
});
33+
}
34+
35+
}

0 commit comments

Comments
 (0)