Docker-Java/Docker远程API阻塞直至容器完成

4

我正在尝试使用docker-java从java中使用docker远程API,但我无法找到一种方法来查看我的容器执行何时完成:

 CreateContainerResponse container = dockerClient.createContainerCmd("me/vw:v0.1")
                .withVolumes(workingDIR)
                .withBinds(new Bind("/localDrive", workingDIR))
                .withCmd("vw", "/rcv1/rcv1.train.vw.gz", "--cache_file", "/rcv1/cache_train", "-f", "/rcv1/r_temp")
                .withLogConfig(logconf)
                .exec();
        dockerClient.startContainerCmd((container.getId())).exec();

        Thread.sleep(10000); //OBVIOUSLY BROKEN HACK IS BROKEN
        System.out.println("PRINTING LOGS");
        System.out.println(containerLog(container.getId(), dockerClient));

如何正常检查容器是否完成?我需要编写一些轮询docker服务器的代码,还是有一些方便的阻塞函数/调用可用?docker-java文档非常糟糕,大部分工作都是通过查看测试用例得出的。

谢谢,

Nick


你到底想做什么?为什么你希望你的容器完成? - Matthew
我正在尝试将自包含应用程序打包到Docker镜像中,以便可以像本地Unix程序一样从Java中调用它们。这样做有意义吗? - XapaJIaMnu
嗯,我认为您需要让Docker客户端库等待完成。这个例子调用了awaitCompletion,看起来很有前途。 - Matthew
谢谢,看起来就是我要找的。docker-java 的文档不是很好,所以需要一些时间来理解发生了什么... - XapaJIaMnu
3个回答

6
dockerClient.startContainerCmd(createContainerResponse.getId()).exec();
WaitContainerResultCallback resultCallback = new WaitContainerResultCallback();
dockerClient.waitContainerCmd(createContainerResponse.getId()).exec(resultCallback);
resultCallback.awaitCompletion();
dockerClient.removeContainerCmd(createContainerResponse.getId()).exec();

如何在removeContainerCmd方法中使用"awaitCompletion"? 我遇到了这个问题:我想要删除一个容器,并在启动新容器之前等待其被删除。你知道怎么做吗? - Odravison
为什么它与其他命令不同?就像其他情况一样,只需等待完成即可。 - Dmytro Titov

0
考虑监控 Docker 系统事件,更多信息请参见https://docs.docker.com/engine/api/v1.29/#operation/SystemEvents
您需要创建一个单独的线程并订阅您新创建的容器的生命周期。当您的容器退出时,您将收到通知。通知您的主线程,然后一切都会好起来。这是一项费力的工作。

0
如果您可以访问Docker套接字,您可以使用远程API。这通常仅用于管理员,因为它需要完全的特权。

远程 API 中的哪些内容可以提供阻塞读取?我是管理员,可以访问 Docker 套接字。 - XapaJIaMnu
我不是专家,但我怀疑它是否具有阻塞功能。你需要自己编写。虽然可能会有Python封装器存在。 - Matthew
是的,我想问一下是否有现成的东西可以用,这样我就不用自己写了。 - XapaJIaMnu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接