【问题标题】:docker-java/docker remote api block until container is finisheddocker-java/docker 远程 api 阻塞,直到容器完成
【发布时间】:2016-12-26 16:31:17
【问题描述】:

我正在尝试使用 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 的文档非常糟糕,我所做的大部分工作都是通过查看测试用例来完成的。

干杯,

尼克

【问题讨论】:

  • 你到底想做什么?为什么你希望你的容器完成?
  • 我正在尝试将自包含应用程序打包到 docker 映像中,以便可以像本地 unix 程序一样调用它们,但来自 java。这有意义吗?
  • 嗯。我认为您需要让您的 docker 客户端库等待完成。 This example 调用 awaitCompletion 看起来很有希望。
  • 谢谢,这看起来像我要找的。 docker-java 没有最好的文档,所以它需要一些时间来了解会发生什么......

标签: docker docker-java


【解决方案1】:

如果您可以访问 docker 套接字,则可以使用 remote API。这通常只用于管理员,因为它需要完全权限。

【讨论】:

  • 远程 API 中究竟是什么给了我阻塞读取?我是管理员,我可以访问 docker 套接字。
  • 我不是专家,但我怀疑它是否具有阻止功能。你必须写那个。虽然某处可能有一个 python 包装器。
  • 是的,我在问是否有可用的东西,这样我就不必自己写了。
【解决方案2】:

考虑监控 Docker 系统事件,更多信息请点击此处 https://docs.docker.com/engine/api/v1.29/#operation/SystemEvents

您需要创建一个单独的线程并订阅新创建的容器的生命周期。您将在容器退出时收到通知。通知你的主线程,你会没事的。费力。

【讨论】:

    【解决方案3】:
    dockerClient.startContainerCmd(createContainerResponse.getId()).exec();
    WaitContainerResultCallback resultCallback = new WaitContainerResultCallback();
    dockerClient.waitContainerCmd(createContainerResponse.getId()).exec(resultCallback);
    resultCallback.awaitCompletion();
    dockerClient.removeContainerCmd(createContainerResponse.getId()).exec();
    

    【讨论】:

    • 如何在removeContainerCmd 方法中使用“awaitCompletion”?我正面临这个问题:我想删除一个容器并等待被删除,然后再开始一个新的。你知道怎么做吗?
    • 为什么和其他命令不一样?与其他情况一样,只需等待完成即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2012-05-16
    相关资源
    最近更新 更多