From a9c478bd6eb3f7afae5f0a62013b701eb614eb5c Mon Sep 17 00:00:00 2001 From: Nigel Magnay Date: Wed, 25 Mar 2015 19:58:18 +0000 Subject: [PATCH] Dockerfiles not called 'dockerfile' Pass the name of the Dockerfile to docker. Adjust the TAR file to build from the correct path Implement some tests to show it working with a nonstandard name. Signed-off-by: Nigel Magnay --- .../github/dockerjava/api/DockerClient.java | 4 +- .../dockerjava/api/command/BuildImageCmd.java | 6 ++- .../dockerjava/core/DockerClientImpl.java | 6 +++ .../core/command/BuildImageCmdImpl.java | 40 +++++++++++++++---- .../core/dockerfile/Dockerfile.java | 6 ++- .../dockerjava/jaxrs/BuildImageCmdExec.java | 4 ++ .../core/command/BuildImageCmdImplTest.java | 28 +++++++++++++ .../subdirectory/Dockerfile-nonstandard | 12 ++++++ 8 files changed, 96 insertions(+), 10 deletions(-) create mode 100644 src/test/resources/nonstandard/subdirectory/Dockerfile-nonstandard diff --git a/src/main/java/com/github/dockerjava/api/DockerClient.java b/src/main/java/com/github/dockerjava/api/DockerClient.java index c4e4859c4..9e275eb35 100644 --- a/src/main/java/com/github/dockerjava/api/DockerClient.java +++ b/src/main/java/com/github/dockerjava/api/DockerClient.java @@ -98,7 +98,9 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd( public CommitCmd commitCmd(String containerId); - public BuildImageCmd buildImageCmd(File dockerFolder); + public BuildImageCmd buildImageCmd(); + + public BuildImageCmd buildImageCmd(File dockerFileOrFolder); public BuildImageCmd buildImageCmd(InputStream tarInputStream); 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 becaeccc6..1f26d37d7 100644 --- a/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java +++ b/src/main/java/com/github/dockerjava/api/command/BuildImageCmd.java @@ -28,8 +28,12 @@ public interface BuildImageCmd extends DockerCmd{ public boolean isQuiet(); + public String getPathToDockerfile(); + public AuthConfigurations getBuildAuthConfigs(); - + + public BuildImageCmd withBaseDirectory(File baseDirectory); + public BuildImageCmd withDockerfile(File dockerfile); public BuildImageCmd withTarInputStream(InputStream tarInputStream); diff --git a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java index 0dd560af3..de3d9e238 100644 --- a/src/main/java/com/github/dockerjava/core/DockerClientImpl.java +++ b/src/main/java/com/github/dockerjava/core/DockerClientImpl.java @@ -291,6 +291,12 @@ public CommitCmd commitCmd(String containerId) { .createCommitCmdExec(), containerId); } + @Override + public BuildImageCmd buildImageCmd() { + return new BuildImageCmdImpl(getDockerCmdExecFactory() + .createBuildImageCmdExec()); + } + @Override public BuildImageCmd buildImageCmd(File dockerFileOrFolder) { return new BuildImageCmdImpl(getDockerCmdExecFactory() 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 c793ed6e6..180befd03 100644 --- a/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java +++ b/src/main/java/com/github/dockerjava/core/command/BuildImageCmdImpl.java @@ -9,6 +9,7 @@ import com.github.dockerjava.api.command.BuildImageCmd; import com.github.dockerjava.api.model.AuthConfigurations; import com.github.dockerjava.core.dockerfile.Dockerfile; +import com.google.common.base.Optional; /** * @@ -24,6 +25,8 @@ public class BuildImageCmdImpl extends AbstrDockerCmd filesToAdd = new ArrayList(); public InputStream buildDockerFolderTar() { + return buildDockerFolderTar(getDockerFolder()); + } + + public InputStream buildDockerFolderTar(File directory) { // ARCHIVE TAR File dockerFolderTar = null; @@ -173,7 +177,7 @@ public InputStream buildDockerFolderTar() { try { String archiveNameWithOutExtension = UUID.randomUUID().toString(); - dockerFolderTar = CompressArchiveUtil.archiveTARFiles(getDockerFolder(), + dockerFolderTar = CompressArchiveUtil.archiveTARFiles(directory, filesToAdd, archiveNameWithOutExtension); return FileUtils.openInputStream(dockerFolderTar); diff --git a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java index 405192adb..5c2b87fc6 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java +++ b/src/main/java/com/github/dockerjava/jaxrs/BuildImageCmdExec.java @@ -35,6 +35,7 @@ public BuildImageCmdExec(WebTarget baseResource) { @Override protected ResponseImpl execute(BuildImageCmd command) { WebTarget webResource = getBaseResource().path("/build"); + String dockerFilePath = command.getPathToDockerfile(); if(command.getTag() != null) { webResource = webResource.queryParam("t", command.getTag()); @@ -48,6 +49,9 @@ protected ResponseImpl execute(BuildImageCmd command) { if (command.isQuiet()) { webResource = webResource.queryParam("q", "true"); } + if( dockerFilePath != null && !"Dockerfile".equals(dockerFilePath)) { + webResource = webResource.queryParam("dockerfile", dockerFilePath); + } webResource.property(ClientProperties.REQUEST_ENTITY_PROCESSING, RequestEntityProcessing.CHUNKED); 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 4c69d86e8..c1a70ef28 100644 --- a/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/BuildImageCmdImplTest.java @@ -76,6 +76,34 @@ public void testNginxDockerfileBuilder() { equalTo("Guillaume J. Charmes \"guillaume@dotcloud.com\"")); } + @Test + public void testNonstandard1() { + File baseDir = new File(Thread.currentThread().getContextClassLoader() + .getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile()); + + InputStream response = dockerClient.buildImageCmd(baseDir).withNoCache().exec(); + + String fullLog = asString(response); + assertThat(fullLog, containsString("Successfully built")); + } + + @Test + public void testNonstandard2() { + File baseDir = new File(Thread.currentThread().getContextClassLoader() + .getResource("nonstandard").getFile()); + File dockerFile = new File(Thread.currentThread().getContextClassLoader() + .getResource("nonstandard/subdirectory/Dockerfile-nonstandard").getFile()); + + + InputStream response = dockerClient.buildImageCmd() + .withBaseDirectory(baseDir) + .withDockerfile(dockerFile) + .withNoCache().exec(); + + String fullLog = asString(response); + assertThat(fullLog, containsString("Successfully built")); + } + @Test public void testDockerBuilderAddUrl() { File baseDir = new File(Thread.currentThread().getContextClassLoader() diff --git a/src/test/resources/nonstandard/subdirectory/Dockerfile-nonstandard b/src/test/resources/nonstandard/subdirectory/Dockerfile-nonstandard new file mode 100644 index 000000000..2d0fa24cb --- /dev/null +++ b/src/test/resources/nonstandard/subdirectory/Dockerfile-nonstandard @@ -0,0 +1,12 @@ +# Nginx +# +# VERSION 0.0.1 + +FROM ubuntu:latest +MAINTAINER Guillaume J. Charmes "guillaume@dotcloud.com" + +# make sure the package repository is up to date +RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list +RUN apt-get update + +RUN apt-get install -y inotify-tools nginx apache2 openssh-server \ No newline at end of file