diff --git a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java index 20b23e903..ac98db2f9 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -101,6 +101,12 @@ public interface BuildImageCmd extends AsyncDockerCmd getLabels(); + // setters BuildImageCmd withTag(String tag); @@ -145,6 +151,11 @@ public interface BuildImageCmd extends AsyncDockerCmd labels); + interface Exec extends DockerCmdAsyncExec { } diff --git a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java index 487f0b264..c34b05155 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -56,6 +56,8 @@ public class BuildImageCmdImpl extends AbstrAsyncDockerCmd buildArgs; + private Map labels; + public BuildImageCmdImpl(BuildImageCmd.Exec exec) { super(exec); } @@ -149,6 +151,11 @@ public Map getBuildArgs() { return buildArgs; } + @Override + public Map getLabels() { + return labels; + } + // getter lib specific @Override @@ -303,6 +310,15 @@ public BuildImageCmd withShmsize(Long shmsize) { return this; } + /** + * @see #labels + */ + @Override + public BuildImageCmd withLabels(Map labels) { + this.labels = labels; + return this; + } + @Override public void close() { super.close(); diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 43e7687eb..2a7aea40e 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.net.URLEncoder; +import java.util.Map; public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements BuildImageCmd.Exec { @@ -99,19 +100,14 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag webTarget = webTarget.queryParam("rm", "false"); } - if (command.getBuildArgs() != null && !command.getBuildArgs().isEmpty()) { - try { - webTarget = webTarget.queryParam("buildargs", - URLEncoder.encode(MAPPER.writeValueAsString(command.getBuildArgs()), "UTF-8")); - } catch (IOException e) { - throw new RuntimeException(e); - } - } + webTarget = writeMap(webTarget, "buildargs", command.getBuildArgs()); if (command.getShmsize() != null) { webTarget = webTarget.queryParam("shmsize", command.getShmsize()); } + webTarget = writeMap(webTarget, "labels", command.getLabels()); + webTarget.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); webTarget.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024 * 1024); @@ -123,4 +119,17 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag entity(command.getTarInputStream(), "application/tar") ); } + + private WebTarget writeMap(WebTarget webTarget, String name, Map value) { + if (value != null && !value.isEmpty()) { + try { + return webTarget.queryParam(name, + URLEncoder.encode(MAPPER.writeValueAsString(value), "UTF-8")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else { + return webTarget; + } + } } diff --git a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java index f4ff04576..43152570e 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java @@ -15,6 +15,7 @@ import com.github.dockerjava.netty.WebTarget; import java.io.IOException; +import java.util.Map; public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements BuildImageCmd.Exec { @@ -85,18 +86,14 @@ protected Void execute0(BuildImageCmd command, ResultCallback webTarget = webTarget.queryParam("cpusetcpus", command.getCpusetcpus()); } - if (command.getBuildArgs() != null && !command.getBuildArgs().isEmpty()) { - try { - webTarget = webTarget.queryParam("buildargs", MAPPER.writeValueAsString(command.getBuildArgs())); - } catch (IOException e) { - throw new RuntimeException(e); - } - } + webTarget = writeMap(webTarget, "buildargs", command.getBuildArgs()); if (command.getShmsize() != null) { webTarget = webTarget.queryParam("shmsize", command.getShmsize()); } + webTarget = writeMap(webTarget, "labels", command.getLabels()); + LOGGER.trace("POST: {}", webTarget); InvocationBuilder builder = resourceWithOptionalAuthConfig(command, webTarget.request()) @@ -109,4 +106,16 @@ protected Void execute0(BuildImageCmd command, ResultCallback return null; } + + private WebTarget writeMap(WebTarget webTarget, String name, Map value) { + if (value != null && !value.isEmpty()) { + try { + return webTarget.queryParam(name, MAPPER.writeValueAsString(value)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else { + return webTarget; + } + } } diff --git a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java index 31f3c3045..cb4c1b2a8 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -1,5 +1,6 @@ package com.github.dockerjava.core.command; +import static com.github.dockerjava.utils.TestUtils.getVersion; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; @@ -12,11 +13,13 @@ import java.io.InputStream; import java.lang.reflect.Method; import java.util.Collection; +import java.util.Collections; import java.util.UUID; import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.TrueFileFilter; import org.testng.ITestResult; +import org.testng.SkipException; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeMethod; @@ -33,6 +36,7 @@ import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Ports.Binding; import com.github.dockerjava.client.AbstractDockerClientTest; +import com.github.dockerjava.core.RemoteApiVersion; import com.github.dockerjava.core.util.CompressArchiveUtil; @Test(groups = "integration") @@ -250,6 +254,26 @@ public void buildArgs() throws Exception { assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc")); } + @Test + public void labels() throws Exception { + if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_23)) { + throw new SkipException("API version should be >= 1.23"); + } + + File baseDir = fileFromBuildTestResource("labels"); + + String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true) + .withLabels(Collections.singletonMap("test", "abc")) + .exec(new BuildImageResultCallback()) + .awaitImageId(); + + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); + assertThat(inspectImageResponse, not(nullValue())); + LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + + assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc")); + } + public void dockerfileNotInBaseDirectory() throws Exception { File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory"); File dockerfile = fileFromBuildTestResource("dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile"); diff --git a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java index 1474ef25f..f567dcfc8 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java @@ -1,5 +1,6 @@ package com.github.dockerjava.netty.exec; +import static com.github.dockerjava.utils.TestUtils.getVersion; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; @@ -12,11 +13,13 @@ import java.io.InputStream; import java.lang.reflect.Method; import java.util.Collection; +import java.util.Collections; import java.util.UUID; import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.TrueFileFilter; import org.testng.ITestResult; +import org.testng.SkipException; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeMethod; @@ -34,6 +37,7 @@ import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.api.model.Ports.Binding; +import com.github.dockerjava.core.RemoteApiVersion; import com.github.dockerjava.core.command.BuildImageResultCallback; import com.github.dockerjava.core.command.PushImageResultCallback; import com.github.dockerjava.core.command.WaitContainerResultCallback; @@ -255,6 +259,26 @@ public void buildArgs() throws Exception { assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc")); } + @Test + public void labels() throws Exception { + if (!getVersion(dockerClient).isGreaterOrEqual(RemoteApiVersion.VERSION_1_23)) { + throw new SkipException("API version should be >= 1.23"); + } + + File baseDir = fileFromBuildTestResource("labels"); + + String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true) + .withLabels(Collections.singletonMap("test", "abc")) + .exec(new BuildImageResultCallback()) + .awaitImageId(); + + InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec(); + assertThat(inspectImageResponse, not(nullValue())); + LOG.info("Image Inspect: {}", inspectImageResponse.toString()); + + assertThat(inspectImageResponse.getConfig().getLabels().get("test"), equalTo("abc")); + } + public void dockerfileNotInBaseDirectory() throws Exception { File baseDirectory = fileFromBuildTestResource("dockerfileNotInBaseDirectory"); File dockerfile = fileFromBuildTestResource("dockerfileNotInBaseDirectory/dockerfileFolder/Dockerfile"); diff --git a/src/test/resources/buildTests/labels/Dockerfile b/src/test/resources/buildTests/labels/Dockerfile new file mode 100644 index 000000000..6a8106b86 --- /dev/null +++ b/src/test/resources/buildTests/labels/Dockerfile @@ -0,0 +1,3 @@ +FROM ubuntu:latest + +CMD ["echo", "Success"]