From 9641b01d0559aa23299bdf229c07a29e065d4398 Mon Sep 17 00:00:00 2001 From: Lappas Dionysis Date: Sun, 8 May 2016 19:07:39 +0300 Subject: [PATCH 1/2] Fixes copyArchiveToContainerCmdImpl fail when hostResource has an empty dir which gets added as last entry to tar CopyArchiveToContainerCmdImpl FAILS with com.github.dockerjava.api.exception.BadRequestException: Unable to perform tar on host resource /path/to/resource, if the resourceHost is a dir that containes an empty dir which will be added as the last entry to the generated .tar file. --- src/main/java/com/github/dockerjava/core/util/TarDirWalker.java | 1 + 1 file changed, 1 insertion(+) 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 7c3a9ca29..af263ee9c 100644 --- a/src/main/java/com/github/dockerjava/core/util/TarDirWalker.java +++ b/src/main/java/com/github/dockerjava/core/util/TarDirWalker.java @@ -26,6 +26,7 @@ public TarDirWalker(Path basePath, TarArchiveOutputStream tarArchiveOutputStream public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { if (!dir.equals(basePath)) { tarArchiveOutputStream.putArchiveEntry(new TarArchiveEntry(FilePathUtil.relativize(basePath, dir))); + tarArchiveOutputStream.closeArchiveEntry(); } return FileVisitResult.CONTINUE; } From d2b2a2dde55f367831a749f6246438d08e4522b5 Mon Sep 17 00:00:00 2001 From: Lappas Dionysis Date: Mon, 9 May 2016 20:41:27 +0300 Subject: [PATCH 2/2] Added Test Case that simulates failure on copyArchiveToContainerCmdImpl when last tar entry is an empty dir --- .../CopyArchiveToContainerCmdImplTest.java | 27 +++++++++++++++++++ 1 file changed, 27 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 0f8f2164b..06967706f 100644 --- a/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java +++ b/src/test/java/com/github/dockerjava/core/command/CopyArchiveToContainerCmdImplTest.java @@ -90,5 +90,32 @@ public void copyToNonExistingContainer() throws Exception { } catch (NotFoundException ignored) { } } + + @Test + public void copyDirWithLastAddedTarEnryEmptyDir() throws Exception{ + // create a temp dir + Path localDir = Files.createTempDirectory(""); + localDir.toFile().deleteOnExit(); + // create sub-dir with name b + Path emptyDir = Files.createTempDirectory(localDir.resolve("b"), ""); + emptyDir.toFile().deleteOnExit(); + // creaet sub-dir with name a + Path dirWithFile = Files.createTempDirectory(localDir.resolve("a"), ""); + dirWithFile.toFile().deleteOnExit(); + // create file in sub-dir b, name or conter are irrelevant + Path file = Files.createTempFile(dirWithFile.resolve("file"), "", ""); + file.toFile().deleteOnExit(); + + // create a test container + CreateContainerResponse container = dockerClient.createContainerCmd("progrium/busybox:latest") + .withCmd("/bin/sh", "-c", "while true; do sleep 9999; done") + .exec(); + // start the container + dockerClient.startContainerCmd(container.getId()).exec(); + // copy data from local dir to container + dockerClient.copyArchiveToContainerCmd(container.getId()) + .withHostResource(localDir.toString()) + .exec(); + } }