使用Spotify Docker Java客户端阻塞日志消息

描述

即时通讯使用以下function,以便能够阻止surefiretesting,直到docker集装箱启动。 这几乎总是有效的,但有些时候我得到如下所示的exception。 我不确定什么情况next会失败的dockerClient.logs或如果dockerClient.logs如何获取日志stream的问题。

我的问题是:

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

什么会导致exception看到?

 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服务器上。

你能指望什么

没有任何抛出,我们将读取日志。

发生了什么呢?

抛出exception。

软件:

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客户端版本: 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)