@@ -2,10 +2,45 @@ var stream = require('stream');
2
2
var EventEmitter = require ( 'events' ) . EventEmitter ;
3
3
var es = require ( 'event-stream' )
4
4
var debug = require ( 'debug' ) ( 'strider-docker-runner:create-container' )
5
-
5
+ var async = require ( 'async' ) ;
6
6
var demuxer = require ( './demuxer' )
7
+ var inspect = require ( 'util' ) . inspect ;
7
8
8
- module . exports = function ( createOptions , docker , config , done ) {
9
+ function isImageLocally ( docker , image , done ) {
10
+ var withoutTag = image . split ( ':' ) [ 0 ] ;
11
+ var fullname = image === withoutTag ?
12
+ image + ':latest' :
13
+ image ;
14
+
15
+ docker . listImages ( { filter : withoutTag } , function ( err , images ) {
16
+ if ( err ) return done ( err ) ;
17
+
18
+ var found = images . some ( function ( img ) {
19
+ return ~ img . RepoTags . indexOf ( fullname ) ;
20
+ } ) ;
21
+
22
+ done ( null , found ) ;
23
+ } ) ;
24
+ }
25
+
26
+ function pull ( docker , image , done ) {
27
+ docker . pull ( image , function ( err , streamc ) {
28
+ if ( err ) return done ( err )
29
+
30
+ streamc
31
+ . pipe ( es . map ( function ( data , cb ) {
32
+ cb ( null , JSON . parse ( data ) )
33
+ } ) )
34
+ . on ( 'data' , function ( event ) {
35
+ debug ( 'pull event: ' + inspect ( event ) ) ;
36
+ } )
37
+ . on ( 'end' , function ( ) {
38
+ done ( ) ;
39
+ } ) ;
40
+ } ) ;
41
+ }
42
+
43
+ function create ( createOptions , docker , config , done ) {
9
44
docker . createContainer ( createOptions , function ( err , container ) {
10
45
if ( err ) return done ( new Error ( err ) ) ;
11
46
debug ( '[runner:docker] container id' , container . id )
@@ -83,3 +118,20 @@ module.exports = function (createOptions, docker, config, done) {
83
118
}
84
119
} )
85
120
}
121
+
122
+ module . exports = function ( createOptions , docker , config , done ) {
123
+ async . waterfall ( [
124
+ function ( callback ) {
125
+ isImageLocally ( docker , createOptions . Image , callback ) ;
126
+ } , function ( isLocally , callback ) {
127
+ if ( isLocally ) {
128
+ debug ( 'image is already locally' )
129
+ return callback ( ) ;
130
+ }
131
+ debug ( 'Unable to find image "%s" locally' , createOptions . Image ) ;
132
+ pull ( docker , createOptions . Image , callback ) ;
133
+ } , function ( ) {
134
+ create ( createOptions , docker , config , done )
135
+ }
136
+ ] ) ;
137
+ }
0 commit comments