From f4dc5637965064c8627137c08511dfc2a84b2aec Mon Sep 17 00:00:00 2001 From: Lappas Dionysis Date: Sat, 14 May 2016 23:58:45 +0300 Subject: [PATCH 1/7] Fixes execute permissions for files inside a dir added to tar using copyArchiveToContainerCmdIml. Files added to tar are stored with 644 permission mode. As a result, execute permissions are discarded. This fix retains permissions for files inside directories copied with copyArchiveToContainerCmdIml. --- .../java/com/github/dockerjava/core/util/TarDirWalker.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/dockerjava/core/util/TarDirWalker.java b/src/main/java/com/github/dockerjava/core/util/TarDirWalker.java index af263ee9c..3c5336a28 100644 --- a/src/main/java/com/github/dockerjava/core/util/TarDirWalker.java +++ b/src/main/java/com/github/dockerjava/core/util/TarDirWalker.java @@ -33,8 +33,11 @@ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) th @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - CompressArchiveUtil.putTarEntry(tarArchiveOutputStream, - new TarArchiveEntry(FilePathUtil.relativize(basePath, file)), file); + TarArchiveEntry tarEntry = new TarArchiveEntry(FilePathUtil.relativize(basePath, file)); + if (filePath.toFile().canExecute()) { + tarEntry.setMode(tarEntry.getMode() | 0755); + } + CompressArchiveUtil.putTarEntry(tarArchiveOutputStream, tarEntry, file); return FileVisitResult.CONTINUE; } From e229005fd43e9e8d89d52f115ad096947cfd6b14 Mon Sep 17 00:00:00 2001 From: Lappas Dionysis Date: Sun, 15 May 2016 00:02:44 +0300 Subject: [PATCH 2/7] Fixes execute permissions for files not contained in any dir that are added to tar using copyArchiveToContainerCmdIml. --- .../github/dockerjava/core/util/CompressArchiveUtil.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java index 5052dda40..a4616514e 100644 --- a/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java @@ -67,7 +67,11 @@ public static void tar(Path inputPath, Path outputPath, boolean gZipped, boolean try (TarArchiveOutputStream tarArchiveOutputStream = buildTarStream(outputPath, gZipped)) { if (!Files.isDirectory(inputPath)) { - putTarEntry(tarArchiveOutputStream, new TarArchiveEntry(inputPath.getFileName().toString()), inputPath); + TarArchiveEntry tarEntry = new TarArchiveEntry(inputPath.getFileName().toString()); + if (filePath.toFile().canExecute()) { + tarEntry.setMode(tarEntry.getMode() | 0755); + } + putTarEntry(tarArchiveOutputStream, tarEntry, inputPath); } else { Path sourcePath = inputPath; if (!childrenOnly) { From cc93a1fb54bea392cf0c2da5c82ab190a2f921bd Mon Sep 17 00:00:00 2001 From: Lappas Dionysis Date: Sun, 15 May 2016 01:15:58 +0300 Subject: [PATCH 3/7] Added Test Case for CopyArchiveToContainerCmdImpl when copying files with execute permission. Test Case that simulates a scenario where a script file with permission to execute is copied to the containers with CopyArchiveToContainerCmdImpl and then it is executed. --- .../CopyArchiveToContainerCmdImplTest.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java index 06967706f..04117aba7 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java @@ -3,6 +3,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.isEmptyOrNullString; import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.equalTo; import java.io.IOException; import java.io.InputStream; @@ -117,5 +118,39 @@ public void copyDirWithLastAddedTarEnryEmptyDir() throws Exception{ .withHostResource(localDir.toString()) .exec(); } + + @Test + public void copyFileWithExecutePermission() throws Exception { + // create script file, add permission to execute + scriptPath = Files.createTempFile("run", ".sh"); + boolean executable = scriptPath.toFile().setExecutable(true, false); + if (!executable){ + throw new Exception("Execute permission on file not set!"); + } + String snippet = "Running script with execute permission."; + String scriptTextStr = "#!/bin/sh\necho \"" + snippet + "\""; + // write content for created script + Files.write(scriptPath, scriptTextStr.getBytes()); + // create a test container which starts and waits 3 seconds for the + // script to be copied to the container's home dir and then executes it + String containerCmd = "sleep 3; /home/" + scriptPath.getFileName().toString(); + CreateContainerResponse container = docker.createContainerCmd("busybox") + .withName("test") + .withCmd("/bin/sh", "-c", containerCmd) + .exec(); + // start the container + docker.startContainerCmd(container.getId()).exec(); + // copy script to container home dir + docker.copyArchiveToContainerCmd(container.getId()) + .withRemotePath("/home") + .withHostResource(scriptPath.toString()) + .exec(); + // await exid code + int exitCode = docker.waitContainerCmd(container.getId()) + .exec(new WaitContainerResultCallback()) + .awaitStatusCode(); + // check result + assertThat(exitCode, equalTo(0)); + } } From d3918c3ff3e17dbb4cf3442bae0aa1b22c8ef857 Mon Sep 17 00:00:00 2001 From: Lappas Dionysis Date: Sun, 15 May 2016 01:52:35 +0300 Subject: [PATCH 4/7] Fixed input file name --- .../com/github/dockerjava/core/util/CompressArchiveUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java b/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java index a4616514e..2e75bcc41 100644 --- a/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java +++ b/src/main/java/com/github/dockerjava/core/util/CompressArchiveUtil.java @@ -68,7 +68,7 @@ public static void tar(Path inputPath, Path outputPath, boolean gZipped, boolean try (TarArchiveOutputStream tarArchiveOutputStream = buildTarStream(outputPath, gZipped)) { if (!Files.isDirectory(inputPath)) { TarArchiveEntry tarEntry = new TarArchiveEntry(inputPath.getFileName().toString()); - if (filePath.toFile().canExecute()) { + if (inputPath.toFile().canExecute()) { tarEntry.setMode(tarEntry.getMode() | 0755); } putTarEntry(tarArchiveOutputStream, tarEntry, inputPath); From c93a1fca4a062a7d90d361c061aa3a6a2edf6057 Mon Sep 17 00:00:00 2001 From: Lappas Dionysis Date: Sun, 15 May 2016 01:55:10 +0300 Subject: [PATCH 5/7] Fixed name for variable --- src/main/java/com/github/dockerjava/core/util/TarDirWalker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/dockerjava/core/util/TarDirWalker.java b/src/main/java/com/github/dockerjava/core/util/TarDirWalker.java index 3c5336a28..bbe834ee6 100644 --- a/src/main/java/com/github/dockerjava/core/util/TarDirWalker.java +++ b/src/main/java/com/github/dockerjava/core/util/TarDirWalker.java @@ -34,7 +34,7 @@ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) th @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { TarArchiveEntry tarEntry = new TarArchiveEntry(FilePathUtil.relativize(basePath, file)); - if (filePath.toFile().canExecute()) { + if (file.toFile().canExecute()) { tarEntry.setMode(tarEntry.getMode() | 0755); } CompressArchiveUtil.putTarEntry(tarArchiveOutputStream, tarEntry, file); From 7ee187b7ee025ac2a798842f1db06ea198ad6666 Mon Sep 17 00:00:00 2001 From: Lappas Dionysis Date: Sun, 15 May 2016 02:01:14 +0300 Subject: [PATCH 6/7] Added missing variable type declaration --- .../core/command/CopyArchiveToContainerCmdImplTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java index 04117aba7..a1652456e 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java @@ -122,7 +122,7 @@ public void copyDirWithLastAddedTarEnryEmptyDir() throws Exception{ @Test public void copyFileWithExecutePermission() throws Exception { // create script file, add permission to execute - scriptPath = Files.createTempFile("run", ".sh"); + Path scriptPath = Files.createTempFile("run", ".sh"); boolean executable = scriptPath.toFile().setExecutable(true, false); if (!executable){ throw new Exception("Execute permission on file not set!"); From 381b7db28fd1007dea34b491c57fcd2ba8108591 Mon Sep 17 00:00:00 2001 From: Lappas Dionysis Date: Sun, 15 May 2016 02:07:25 +0300 Subject: [PATCH 7/7] Fixed docker client name --- .../core/command/CopyArchiveToContainerCmdImplTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java b/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java index a1652456e..d96a6ad25 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java @@ -134,19 +134,19 @@ public void copyFileWithExecutePermission() throws Exception { // create a test container which starts and waits 3 seconds for the // script to be copied to the container's home dir and then executes it String containerCmd = "sleep 3; /home/" + scriptPath.getFileName().toString(); - CreateContainerResponse container = docker.createContainerCmd("busybox") + CreateContainerResponse container = dockerClient.createContainerCmd("busybox") .withName("test") .withCmd("/bin/sh", "-c", containerCmd) .exec(); // start the container - docker.startContainerCmd(container.getId()).exec(); + dockerClient.startContainerCmd(container.getId()).exec(); // copy script to container home dir - docker.copyArchiveToContainerCmd(container.getId()) + dockerClient.copyArchiveToContainerCmd(container.getId()) .withRemotePath("/home") .withHostResource(scriptPath.toString()) .exec(); // await exid code - int exitCode = docker.waitContainerCmd(container.getId()) + int exitCode = dockerClient.waitContainerCmd(container.getId()) .exec(new WaitContainerResultCallback()) .awaitStatusCode(); // check result