2016-08-19 7 views
1

docker-javaを使用してjavaからdockerリモートAPIを使用しようとしていますが、コンテナの実行が完了した時刻を確認する方法を見つけるのに苦労しています:コンテナが終了するまでdocker-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-javaには本当に悪いドキュメントがあり、私が試したことのほとんどはテストケースを見ることによるものです。

乾杯、

ニック

+0

あなたは正確に何をしようとしていますか?あなたのコンテナをなぜ仕上げたいのですか? – Matthew

+0

私はローカルのUNIXプログラムであるかのように呼び出すことができるように、dockerイメージの内部に自己完結型アプリケーションをパッケージしようとしていますが、javaからです。これは理にかなっていますか? – XapaJIaMnu

+0

Hmm。ドッカーのクライアントライブラリにcompletitonを待たせる必要があると思います。 [この例](https://github.com/docker-java/docker-java/blob/master/src/test/java/com/github/dockerjava/core/command/AttachContainerCmdImplTest.java)は 'awaitCompletion'を呼び出します。有望に見えます。 – Matthew

答えて

0

あなたがremote APIを使用することができますドッカソケットへのアクセスを持っている場合。これは通常、完全な権限を必要とするため、管理者だけが使用します。

+0

リモートAPIには正確に何がブロックされていますか?私は管理者であり、ドッカーソケットにアクセスできます。 – XapaJIaMnu

+0

私は専門家ではありませんが、ブロック機能を持っているかどうかは疑問です。あなたはそれを書かなければならないでしょう。おそらくどこかにPythonラッパーがあります。 – Matthew

+0

ええ、私はそれを自分で書く必要がないように、利用できるものがあるかどうか尋ねていました。 – XapaJIaMnu

0

はあなたが別のスレッドを作成して、新しく作成されたコンテナのライフサイクルに加入する必要があります https://docs.docker.com/engine/api/v1.29/#operation/SystemEvents

よりここで、ドッカーシステムイベントを監視することを検討して。あなたはコンテナ出口で通知を受け取ります。あなたのメインスレッドに通知して、あなたは大丈夫です。労苦。

1
dockerClient.startContainerCmd(createContainerResponse.getId()).exec(); 
WaitContainerResultCallback resultCallback = new WaitContainerResultCallback(); 
dockerClient.waitContainerCmd(createContainerResponse.getId()).exec(resultCallback); 
resultCallback.awaitCompletion(); 
dockerClient.removeContainerCmd(createContainerResponse.getId()).exec(); 
関連する問題