使用Spotify Docker Java Client阻止logmessage

时间:2017-10-04 12:21:46

标签: java docker jenkins

描述

我使用以下函数来阻止surefire测试,直到docker容器启动。 这几乎总是有效,但有些时候我得到如下所示的异常。我不确定nextLogStream失败的情况下,或dockerClient.logs如何获取日志流的问题。

  

我的问题是:

     

其他人如何使用docker客户端等待   日志?

     

什么会导致我看到异常?

public void waitForLog(String messageToMatch) throws Exception {
    logger.info("Waiting for toc.log to signal start of service with log message: " + messageToMatch);
    LogStream logs = dockerClient.logs(container.id(), follow(), stdout());
    String log;
    do {
        LogMessage logMessage = logs.next();
        ByteBuffer buffer = logMessage.content();
        byte[] bytes = new byte[buffer.remaining()];
        buffer.get(bytes);
        log = new String(bytes);
    } while (!log.contains(messageToMatch));
}

如何重现

我仍然不确定如何重现,因为它只在本地机器上很少发生,但总是在我们的Jenkins服务器上发生。

您期待什么

没有抛出任何异常,我们将阅读日志。

反而发生了什么

抛出异常。

软件:

Docker版本:

Client:
 Version:      17.03.0-ce
 API version:  1.26
 Go version:   go1.7.5
 Git commit:   3a232c8
 Built:        Tue Feb 28 08:01:32 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.0-ce
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   3a232c8
 Built:        Tue Feb 28 08:01:32 2017
 OS/Arch:      linux/amd64
 Experimental: false

Spotify的docker-client版本:7.0.2

完全回溯

Caused by: java.util.NoSuchElementException: null
    at com.google.common.collect.AbstractIterator.next(AbstractIterator.java:154)
    at com.support.test.core.docker.DockerProxy.waitForLog(DockerProxy.java:175)
    at com.support.test.core.runner.TestListener.testRunStarted(TestListener.java:54)
    at org.junit.runner.notification.SynchronizedRunListener.testRunStarted(SynchronizedRunListener.java:35)
    at org.junit.runner.notification.RunNotifier$1.notifyListener(RunNotifier.java:91)
    at org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:72)
    at org.junit.runner.notification.RunNotifier.fireTestRunStarted(RunNotifier.java:88)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:120)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)

0 个答案:

没有答案