1+ package works .weave .socks ;
2+
3+ import org .slf4j .Logger ;
4+ import org .slf4j .LoggerFactory ;
5+
6+ import com .github .dockerjava .api .DockerClient ;
7+ import com .github .dockerjava .api .command .CreateContainerResponse ;
8+ import com .github .dockerjava .api .model .Network ;
9+ import com .github .dockerjava .core .DockerClientBuilder ;
10+ import com .github .dockerjava .core .DockerClientConfig ;
11+ import com .github .dockerjava .core .command .PullImageResultCallback ;
12+ import com .github .dockerjava .core .command .ExecStartResultCallback ;
13+ import com .github .dockerjava .api .exception .DockerException ;
14+ import org .springframework .stereotype .Component ;
15+
16+ import java .lang .Exception ;
17+ import java .util .concurrent .ExecutorService ;
18+ import java .util .concurrent .Executors ;
19+ import java .util .List ;
20+
21+ @ Component
22+ public class DockerSpawner {
23+ private final Logger logger = LoggerFactory .getLogger (this .getClass ());
24+
25+ private DockerClient dc ;
26+ private ExecutorService dockerPool ;
27+
28+ private String imageName = "weaveworksdemos/worker" ;
29+ private String imageVersion = "latest" ;
30+ private String networkId = "weavedemo_backoffice" ;
31+ private int poolSize = 50 ;
32+
33+ public void init () {
34+ if (dc == null ) {
35+ DockerClientConfig .DockerClientConfigBuilder builder = DockerClientConfig .createDefaultConfigBuilder ();
36+
37+ DockerClientConfig config = builder .build ();
38+ dc = DockerClientBuilder .getInstance (config ).build ();
39+
40+ dc .pullImageCmd (imageName ).withTag (imageVersion ).exec (new PullImageResultCallback ()).awaitSuccess ();
41+ }
42+ if (dockerPool == null ) {
43+ dockerPool = Executors .newFixedThreadPool (poolSize );
44+ }
45+ }
46+
47+ public void spawn () {
48+ dockerPool .execute (new Runnable () {
49+ public void run () {
50+ logger .info ("Spawning new container" );
51+ try {
52+ CreateContainerResponse container = dc .createContainerCmd (imageName + ":" + imageVersion ).withNetworkMode (networkId ).withCmd ("ping" , "rabbitmq" ).exec ();
53+ String containerId = container .getId ();
54+ dc .startContainerCmd (containerId ).exec ();
55+ logger .info ("Spawned container with id: " + container .getId () + " on network: " + networkId );
56+ // TODO instead of just sleeping, call await on the container and remove once it's completed.
57+ Thread .sleep (40000 );
58+ try {
59+ dc .stopContainerCmd (containerId ).exec ();
60+ }
61+ catch (DockerException e ) {
62+ logger .info ("Container already stopped. (This is expected)." );
63+ }
64+ dc .removeContainerCmd (containerId ).exec ();
65+ logger .info ("Removed Container:" + containerId );
66+ } catch (Exception e ) {
67+ logger .error ("Exception trying to launch/remove worker container. " + e );
68+ }
69+ }
70+ });
71+ }
72+ }
0 commit comments