Skip to content

Commit 305b73a

Browse files
cberesKostyaSha
authored andcommitted
Label image during build #681 (#684)
* Ability to set labels on image build (#681) * Check API version in new tests (#681) * remove unnecessary this (#681) * change withLabel to withLabels (#681)
1 parent 419900d commit 305b73a

File tree

7 files changed

+111
-15
lines changed

7 files changed

+111
-15
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
@@ -101,6 +101,12 @@ public interface BuildImageCmd extends AsyncDockerCmd<BuildImageCmd, BuildRespon
101101
@CheckForNull
102102
Long getShmsize();
103103

104+
/**
105+
* @since {@link RemoteApiVersion#VERSION_1_23}
106+
*/
107+
@CheckForNull
108+
Map<String, String> getLabels();
109+
104110
// setters
105111

106112
BuildImageCmd withTag(String tag);
@@ -145,6 +151,11 @@ public interface BuildImageCmd extends AsyncDockerCmd<BuildImageCmd, BuildRespon
145151
*/
146152
BuildImageCmd withShmsize(Long shmsize);
147153

154+
/**
155+
*@since {@link RemoteApiVersion#VERSION_1_23}
156+
*/
157+
BuildImageCmd withLabels(Map<String, String> labels);
158+
148159
interface Exec extends DockerCmdAsyncExec<BuildImageCmd, BuildResponseItem> {
149160
}
150161

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

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

5757
private Map<String, String> buildArgs;
5858

59+
private Map<String, String> labels;
60+
5961
public BuildImageCmdImpl(BuildImageCmd.Exec exec) {
6062
super(exec);
6163
}
@@ -149,6 +151,11 @@ public Map<String, String> getBuildArgs() {
149151
return buildArgs;
150152
}
151153

154+
@Override
155+
public Map<String, String> getLabels() {
156+
return labels;
157+
}
158+
152159
// getter lib specific
153160

154161
@Override
@@ -303,6 +310,15 @@ public BuildImageCmd withShmsize(Long shmsize) {
303310
return this;
304311
}
305312

313+
/**
314+
* @see #labels
315+
*/
316+
@Override
317+
public BuildImageCmd withLabels(Map<String, String> labels) {
318+
this.labels = labels;
319+
return this;
320+
}
321+
306322
@Override
307323
public void close() {
308324
super.close();

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

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import java.io.IOException;
2626
import java.net.URLEncoder;
27+
import java.util.Map;
2728

2829
public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec<BuildImageCmd, BuildResponseItem> implements
2930
BuildImageCmd.Exec {
@@ -99,19 +100,14 @@ protected AbstractCallbackNotifier<BuildResponseItem> callbackNotifier(BuildImag
99100
webTarget = webTarget.queryParam("rm", "false");
100101
}
101102

102-
if (command.getBuildArgs() != null && !command.getBuildArgs().isEmpty()) {
103-
try {
104-
webTarget = webTarget.queryParam("buildargs",
105-
URLEncoder.encode(MAPPER.writeValueAsString(command.getBuildArgs()), "UTF-8"));
106-
} catch (IOException e) {
107-
throw new RuntimeException(e);
108-
}
109-
}
103+
webTarget = writeMap(webTarget, "buildargs", command.getBuildArgs());
110104

111105
if (command.getShmsize() != null) {
112106
webTarget = webTarget.queryParam("shmsize", command.getShmsize());
113107
}
114108

109+
webTarget = writeMap(webTarget, "labels", command.getLabels());
110+
115111
webTarget.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED);
116112
webTarget.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024 * 1024);
117113

@@ -123,4 +119,17 @@ protected AbstractCallbackNotifier<BuildResponseItem> callbackNotifier(BuildImag
123119
entity(command.getTarInputStream(), "application/tar")
124120
);
125121
}
122+
123+
private WebTarget writeMap(WebTarget webTarget, String name, Map<String, String> value) {
124+
if (value != null && !value.isEmpty()) {
125+
try {
126+
return webTarget.queryParam(name,
127+
URLEncoder.encode(MAPPER.writeValueAsString(value), "UTF-8"));
128+
} catch (IOException e) {
129+
throw new RuntimeException(e);
130+
}
131+
} else {
132+
return webTarget;
133+
}
134+
}
126135
}

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

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import com.github.dockerjava.netty.WebTarget;
1616

1717
import java.io.IOException;
18+
import java.util.Map;
1819

1920
public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec<BuildImageCmd, BuildResponseItem> implements
2021
BuildImageCmd.Exec {
@@ -85,18 +86,14 @@ protected Void execute0(BuildImageCmd command, ResultCallback<BuildResponseItem>
8586
webTarget = webTarget.queryParam("cpusetcpus", command.getCpusetcpus());
8687
}
8788

88-
if (command.getBuildArgs() != null && !command.getBuildArgs().isEmpty()) {
89-
try {
90-
webTarget = webTarget.queryParam("buildargs", MAPPER.writeValueAsString(command.getBuildArgs()));
91-
} catch (IOException e) {
92-
throw new RuntimeException(e);
93-
}
94-
}
89+
webTarget = writeMap(webTarget, "buildargs", command.getBuildArgs());
9590

9691
if (command.getShmsize() != null) {
9792
webTarget = webTarget.queryParam("shmsize", command.getShmsize());
9893
}
9994

95+
webTarget = writeMap(webTarget, "labels", command.getLabels());
96+
10097
LOGGER.trace("POST: {}", webTarget);
10198

10299
InvocationBuilder builder = resourceWithOptionalAuthConfig(command, webTarget.request())
@@ -109,4 +106,16 @@ protected Void execute0(BuildImageCmd command, ResultCallback<BuildResponseItem>
109106

110107
return null;
111108
}
109+
110+
private WebTarget writeMap(WebTarget webTarget, String name, Map<String, String> value) {
111+
if (value != null && !value.isEmpty()) {
112+
try {
113+
return webTarget.queryParam(name, MAPPER.writeValueAsString(value));
114+
} catch (IOException e) {
115+
throw new RuntimeException(e);
116+
}
117+
} else {
118+
return webTarget;
119+
}
120+
}
112121
}

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.dockerjava.core.command;
22

3+
import static com.github.dockerjava.utils.TestUtils.getVersion;
34
import static org.hamcrest.MatcherAssert.assertThat;
45
import static org.hamcrest.Matchers.containsString;
56
import static org.hamcrest.Matchers.equalTo;
@@ -12,11 +13,13 @@
1213
import java.io.InputStream;
1314
import java.lang.reflect.Method;
1415
import java.util.Collection;
16+
import java.util.Collections;
1517
import java.util.UUID;
1618

1719
import org.apache.commons.io.FileUtils;
1820
import org.apache.commons.io.filefilter.TrueFileFilter;
1921
import org.testng.ITestResult;
22+
import org.testng.SkipException;
2023
import org.testng.annotations.AfterMethod;
2124
import org.testng.annotations.AfterTest;
2225
import org.testng.annotations.BeforeMethod;
@@ -33,6 +36,7 @@
3336
import com.github.dockerjava.api.model.PortBinding;
3437
import com.github.dockerjava.api.model.Ports.Binding;
3538
import com.github.dockerjava.client.AbstractDockerClientTest;
39+
import com.github.dockerjava.core.RemoteApiVersion;
3640
import com.github.dockerjava.core.util.CompressArchiveUtil;
3741

3842
@Test(groups = "integration")
@@ -250,6 +254,26 @@ public void buildArgs() throws Exception {
250254
assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc"));
251255
}
252256

257+
@Test
258+
public void labels() throws Exception {
259+
if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_23)) {
260+
throw new SkipException("API version should be >= 1.23");
261+
}
262+
263+
File baseDir = fileFromBuildTestResource("labels");
264+
265+
String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true)
266+
.withLabels(Collections.singletonMap("test", "abc"))
267+
.exec(new BuildImageResultCallback())
268+
.awaitImageId();
269+
270+
InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec();
271+
assertThat(inspectImageResponse, not(nullValue()));
272+
LOG.info("Image Inspect: {}", inspectImageResponse.toString());
273+
274+
assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc"));
275+
}
276+
253277
public void dockerfileNotInBaseDirectory() throws Exception {
254278
File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory");
255279
File dockerfile = fileFromBuildTestResource("dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile");

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.dockerjava.netty.exec;
22

3+
import static com.github.dockerjava.utils.TestUtils.getVersion;
34
import static org.hamcrest.MatcherAssert.assertThat;
45
import static org.hamcrest.Matchers.containsString;
56
import static org.hamcrest.Matchers.equalTo;
@@ -12,11 +13,13 @@
1213
import java.io.InputStream;
1314
import java.lang.reflect.Method;
1415
import java.util.Collection;
16+
import java.util.Collections;
1517
import java.util.UUID;
1618

1719
import org.apache.commons.io.FileUtils;
1820
import org.apache.commons.io.filefilter.TrueFileFilter;
1921
import org.testng.ITestResult;
22+
import org.testng.SkipException;
2023
import org.testng.annotations.AfterMethod;
2124
import org.testng.annotations.AfterTest;
2225
import org.testng.annotations.BeforeMethod;
@@ -34,6 +37,7 @@
3437
import com.github.dockerjava.api.model.PortBinding;
3538
import com.github.dockerjava.api.model.Ports;
3639
import com.github.dockerjava.api.model.Ports.Binding;
40+
import com.github.dockerjava.core.RemoteApiVersion;
3741
import com.github.dockerjava.core.command.BuildImageResultCallback;
3842
import com.github.dockerjava.core.command.PushImageResultCallback;
3943
import com.github.dockerjava.core.command.WaitContainerResultCallback;
@@ -255,6 +259,26 @@ public void buildArgs() throws Exception {
255259
assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc"));
256260
}
257261

262+
@Test
263+
public void labels() throws Exception {
264+
if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_23)) {
265+
throw new SkipException("API version should be >= 1.23");
266+
}
267+
268+
File baseDir = fileFromBuildTestResource("labels");
269+
270+
String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true)
271+
.withLabels(Collections.singletonMap("test", "abc"))
272+
.exec(new BuildImageResultCallback())
273+
.awaitImageId();
274+
275+
InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec();
276+
assertThat(inspectImageResponse, not(nullValue()));
277+
LOG.info("Image Inspect: {}", inspectImageResponse.toString());
278+
279+
assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc"));
280+
}
281+
258282
public void dockerfileNotInBaseDirectory() throws Exception {
259283
File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory");
260284
File dockerfile = fileFromBuildTestResource("dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile");
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FROM ubuntu:latest
2+
3+
CMD ["echo", "Success"]

0 commit comments

Comments
 (0)