private void collectLogs(String container, DockerCompose dockerCompose) { executor.submit(() -> { File outputFile = new File(logDirectory, container + ".log"); log.info("Writing logs for container '{}' to '{}'", container, outputFile.getAbsolutePath()); try (FileOutputStream outputStream = new FileOutputStream(outputFile)) { dockerCompose.writeLogs(container, outputStream); } catch (IOException e) { throw new RuntimeException("Error reading log", e); } }); }
public DefaultDockerCompose(DockerComposeFiles dockerComposeFiles, DockerMachine dockerMachine, ProjectName projectName) { this(DockerComposeExecutable.builder() .dockerComposeFiles(dockerComposeFiles) .dockerConfiguration(dockerMachine) .projectName(projectName) .build(), dockerMachine); }
public String execute(ErrorHandler errorHandler, String... commands) throws IOException, InterruptedException { ProcessResult result = run(commands); if (result.exitCode() != 0) { errorHandler.handle(result.exitCode(), result.output(), executable.commandName(), commands); } return result.output(); }
@Override public String exec(DockerComposeExecOption dockerComposeExecOption, String containerName, DockerComposeExecArgument dockerComposeExecArgument) throws IOException, InterruptedException { verifyDockerComposeVersionAtLeast(VERSION_1_7_0, "You need at least docker-compose 1.7 to run docker-compose exec"); String[] fullArgs = constructFullDockerComposeExecArguments(dockerComposeExecOption, containerName, dockerComposeExecArgument); return command.execute(Command.throwingOnError(), fullArgs); }
@Override public String run(DockerComposeRunOption dockerComposeRunOption, String containerName, DockerComposeRunArgument dockerComposeRunArgument) throws IOException, InterruptedException { String[] fullArgs = constructFullDockerComposeRunArguments(dockerComposeRunOption, containerName, dockerComposeRunArgument); return command.execute(Command.throwingOnError(), fullArgs); }
@Override public void up() throws IOException, InterruptedException { retryer.<Void>runWithRetries(() -> { super.up(); return null; }); }
public static ErrorHandler throwingOnError() { return (exitCode, output, commandName, commands) -> { String message = constructNonZeroExitErrorMessage(exitCode, commandName, commands) + "\nThe output was:\n" + output; throw new DockerExecutionException(message); }; }
private static void removeNetworks(DockerCompose dockerCompose, Docker docker) throws IOException, InterruptedException { dockerCompose.down(); docker.pruneNetworks(); } }
@Override public synchronized void startCollecting(DockerCompose dockerCompose) throws IOException, InterruptedException { if (executor != null) { throw new RuntimeException("Cannot start collecting the same logs twice"); } List<ContainerName> containerNames = dockerCompose.ps(); if (containerNames.size() == 0) { return; } executor = Executors.newFixedThreadPool(containerNames.size()); containerNames.stream() .map(ContainerName::semanticName) .forEachOrdered(container -> this.collectLogs(container, dockerCompose)); }
private String dockerExecOnClient(String... arguments) { for (int i = 1; i <= MAX_EXEC_TRIES; i++) { try { log.info("Attempting docker-exec with arguments: {}", Arrays.asList(arguments)); return dockerComposeRule.exec( DockerComposeExecOption.noOptions(), CONTAINER, ImmutableDockerComposeExecArgument.arguments(arguments)); } catch (InterruptedException | IOException e) { throw Throwables.propagate(e); } catch (DockerExecutionException e) { if (i != MAX_EXEC_TRIES) { // I have seen very odd flakes where exec terminates with exit code 129 // i.e. they are interrupted with the hangup signal. log.warn("Encountered error in docker-exec, retrying (attempt {} of {})", i, MAX_EXEC_TRIES, e); } else { log.error("Made {} attempts, and now giving up", MAX_EXEC_TRIES, e); throw e; } } } throw new IllegalStateException( String.format("Unexpected state after %s unsuccessful attempts in docker-exec", MAX_EXEC_TRIES)); } }
public String execute(ErrorHandler errorHandler, String... commands) throws IOException, InterruptedException { ProcessResult result = run(commands); if (result.exitCode() != 0) { errorHandler.handle(result.exitCode(), result.output(), executable.commandName(), commands); } return result.output(); }
@Override public String exec(DockerComposeExecOption dockerComposeExecOption, String containerName, DockerComposeExecArgument dockerComposeExecArgument) throws IOException, InterruptedException { verifyDockerComposeVersionAtLeast(VERSION_1_7_0, "You need at least docker-compose 1.7 to run docker-compose exec"); String[] fullArgs = constructFullDockerComposeExecArguments(dockerComposeExecOption, containerName, dockerComposeExecArgument); return command.execute(Command.throwingOnError(), fullArgs); }
@Override public String run(DockerComposeRunOption dockerComposeRunOption, String containerName, DockerComposeRunArgument dockerComposeRunArgument) throws IOException, InterruptedException { String[] fullArgs = constructFullDockerComposeRunArguments(dockerComposeRunOption, containerName, dockerComposeRunArgument); return command.execute(Command.throwingOnError(), fullArgs); }
@Override public void up() throws IOException, InterruptedException { retryer.<Void>runWithRetries(() -> { super.up(); return null; }); }
public static ErrorHandler throwingOnError() { return (exitCode, output, commandName, commands) -> { String message = constructNonZeroExitErrorMessage(exitCode, commandName, commands) + "\nThe output was:\n" + output; throw new DockerExecutionException(message); }; }
public String execute(ErrorHandler errorHandler, String... commands) throws IOException, InterruptedException { ProcessResult result = run(commands); if (result.exitCode() != 0) { errorHandler.handle(result.exitCode(), result.output(), executable.commandName(), commands); } return result.output(); }
@Override public String run(DockerComposeRunOption dockerComposeRunOption, String containerName, DockerComposeRunArgument dockerComposeRunArgument) throws IOException, InterruptedException { String[] fullArgs = constructFullDockerComposeRunArguments(dockerComposeRunOption, containerName, dockerComposeRunArgument); return command.execute(Command.throwingOnError(), fullArgs); }
@Override public void up() throws IOException, InterruptedException { retryer.<Void>runWithRetries(() -> { super.up(); return null; }); }