Details
-
Improvement
-
Resolution: Unresolved
-
Major
-
None
-
10.10
-
None
-
Unknown
-
Description
For example, copy:
- logs/
- jobs/
- extension/ (when verbose = true)
Right now I'm failing to make it work. Since there's no API to copy a folder from the container to the host (see https://github.com/testcontainers/testcontainers-java/issues/1006), I coded this:
/** * @throws Exception if an error occurred during the stop */ public void stop() throws Exception { switch (this.testConfiguration.getServletEngine()) { case JETTY_STANDALONE: this.jettyStandaloneExecutor.stop(); break; default: // Copy the /jobs & /logs directories from the permanent directory from the container to the host // since that's useful when debugging issues. copyPermanentDirectoryToHost("jobs"); copyPermanentDirectoryToHost("logs"); if (this.testConfiguration.isVerbose()) { copyPermanentDirectoryToHost("extension"); } // Nothing else to do, TestContainers automatically stops the container } } private void copyPermanentDirectoryToHost(String directoryName) throws IOException { String containerPath = String.format("%s/%s", this.testConfiguration.getServletEngine().getPermanentDirectory(), directoryName); copyFolderFromContainer(containerPath, this.testConfiguration.getOutputDirectory()); } private void copyFolderFromContainer(String sourceDirectory, String targetDirectory) throws IOException { DockerClient client = this.servletContainer.getDockerClient(); InputStream inputStream = client.copyArchiveFromContainerCmd(this.servletContainer.getContainerId(), sourceDirectory).exec(); TarArchiveInputStream tarInputStream = new TarArchiveInputStream(inputStream); TarArchiveEntry entry; while ((entry = (TarArchiveEntry) tarInputStream.getNextEntry()) != null) { File outputFile = new File(targetDirectory, entry.getName()); if (entry.isDirectory()) { if (!outputFile.exists()) { if (!outputFile.mkdirs()) { throw new IllegalStateException(String.format("Couldn't create directory [%s]", outputFile.getAbsolutePath())); } } } else { OutputStream outputFileStream = new FileOutputStream(outputFile); IOUtils.copy(inputStream, outputFileStream); outputFileStream.close(); } } }
But it fails with a:
java.io.IOException: Truncated TAR archive at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.read(TarArchiveInputStream.java:612) at org.apache.commons.compress.utils.IOUtils.readFully(IOUtils.java:168) at org.apache.commons.compress.utils.IOUtils.skip(IOUtils.java:119) at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextTarEntry(TarArchiveInputStream.java:268) at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextEntry(TarArchiveInputStream.java:552) at org.xwiki.test.docker.junit5.servletEngine.ServletContainerExecutor.copyFolderFromContainer(ServletContainerExecutor.java:217) at org.xwiki.test.docker.junit5.servletEngine.ServletContainerExecutor.copyPermanentDirectoryToHost(ServletContainerExecutor.java:207) at org.xwiki.test.docker.junit5.servletEngine.ServletContainerExecutor.stop(ServletContainerExecutor.java:193) at org.xwiki.test.docker.junit5.XWikiDockerExtension.stopServletEngine(XWikiDockerExtension.java:332) at org.xwiki.test.docker.junit5.XWikiDockerExtension.afterAll(XWikiDockerExtension.java:236) at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$invokeAfterAllCallbacks$11(ClassTestDescriptor.java:396) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72) at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$invokeAfterAllCallbacks$12(ClassTestDescriptor.java:396) at java.util.ArrayList.forEach(ArrayList.java:1249) at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.invokeAfterAllCallbacks(ClassTestDescriptor.java:396) at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.after(ClassTestDescriptor.java:221) at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.after(ClassTestDescriptor.java:74) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:118) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:118) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:74) at java.util.ArrayList.forEach(ArrayList.java:1249) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$4(NodeTestTask.java:112) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:98) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:74) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220) at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188) at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:74) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)