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 96d94fd06..3f3ca5a5e 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -3,12 +3,14 @@ import java.io.File; import java.io.InputStream; import java.net.URI; +import java.util.Map; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.api.model.BuildResponseItem; +import com.github.dockerjava.core.RemoteApiVersion; /** * Build an image from Dockerfile. @@ -87,6 +89,12 @@ public interface BuildImageCmd extends AsyncDockerCmd getBuildArgs(); + // setters public BuildImageCmd withTag(String tag); @@ -115,6 +123,11 @@ public interface BuildImageCmd extends AsyncDockerCmd buildArgs = new HashMap(); + public BuildImageCmdImpl(BuildImageCmd.Exec exec) { super(exec); } @@ -138,6 +142,11 @@ public String getCpusetcpus() { return cpusetcpus; } + @Override + public Map getBuildArgs() { + return buildArgs; + } + // getter lib specific @Override @@ -219,6 +228,12 @@ public BuildImageCmd withCpusetcpus(String cpusetcpus) { return this; } + @Override + public BuildImageCmd withBuildArg(String key, String value) { + this.buildArgs.put(key, value); + return this; + } + // lib specific @Override diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index fd868a7b3..68e56bbec 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -6,6 +6,7 @@ import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; +import com.fasterxml.jackson.databind.ObjectMapper; import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.client.RequestEntityProcessing; import org.slf4j.Logger; @@ -20,9 +21,12 @@ import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier; import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier; +import java.io.IOException; + public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements BuildImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(BuildImageCmdExec.class); + private static final ObjectMapper MAPPER = new ObjectMapper(); public BuildImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { super(baseResource, dockerClientConfig); @@ -88,6 +92,18 @@ protected AbstractCallbackNotifier callbackNotifier(BuildImag webTarget = webTarget.queryParam("cpusetcpus", command.getCpusetcpus()); } + if (command.hasRemoveEnabled() == null || !command.hasRemoveEnabled()) { + webTarget = webTarget.queryParam("rm", "false"); + } + + if (command.getBuildArgs() != null) { + try { + webTarget = webTarget.queryParam("buildargs", MAPPER.writeValueAsString(command.getBuildArgs())); + } catch (IOException e) { + // pass + } + } + webTarget.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); webTarget.property(ClientProperties.CHUNKED_ENCODING_SIZE, 1024 * 1024); 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 9c0e6c09f..0d1573158 100644 --- a/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/netty/exec/BuildImageCmdExec.java @@ -1,5 +1,6 @@ package com.github.dockerjava.netty.exec; +import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,9 +14,12 @@ import com.github.dockerjava.netty.MediaType; import com.github.dockerjava.netty.WebTarget; +import java.io.IOException; + public class BuildImageCmdExec extends AbstrAsyncDockerCmdExec implements BuildImageCmd.Exec { private static final Logger LOGGER = LoggerFactory.getLogger(BuildImageCmdExec.class); + private static final ObjectMapper MAPPER = new ObjectMapper(); public BuildImageCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) { super(baseResource, dockerClientConfig); @@ -80,6 +84,14 @@ protected Void execute0(BuildImageCmd command, ResultCallback webTarget = webTarget.queryParam("cpusetcpus", command.getCpusetcpus()); } + if (command.getBuildArgs() != null) { + try { + webTarget = webTarget.queryParam("buildargs", MAPPER.writeValueAsString(command.getBuildArgs())); + } catch (IOException e) { + // pass + } + } + LOGGER.trace("POST: {}", webTarget); InvocationBuilder builder = resourceWithOptionalAuthConfig(command, webTarget.request()).accept( 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 9623e077f..9266c5ccd 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -304,4 +304,18 @@ public void testBuildFromPrivateRegistry() throws Exception { LOG.info("Image Inspect: {}", inspectImageResponse.toString()); } + + @Test + public void testBuildArgs() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testBuildArgs").getFile()); + + String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withBuildArg("testArg", "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")); + } } 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 7fb94fcd4..e4aa05250 100644 --- a/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java +++ b/src/test/java/com/github/dockerjava/netty/exec/BuildImageCmdExecTest.java @@ -296,4 +296,18 @@ public void testBuildFromPrivateRegistry() throws Exception { LOG.info("Image Inspect: {}", inspectImageResponse.toString()); } + + @Test + public void testBuildArgs() throws Exception { + File baseDir = new File(Thread.currentThread().getContextClassLoader().getResource("testBuildArgs").getFile()); + + String imageId = dockerClient.buildImageCmd(baseDir).withNoCache(true).withBuildArg("testArg", "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")); + } } diff --git a/src/test/resources/testBuildArgs/Dockerfile b/src/test/resources/testBuildArgs/Dockerfile new file mode 100644 index 000000000..c8dd0ae36 --- /dev/null +++ b/src/test/resources/testBuildArgs/Dockerfile @@ -0,0 +1,5 @@ +FROM ubuntu:latest + +ARG testArg + +LABEL "test"=$testArg