Skip to content

Commit e611a95

Browse files
committed
Merge pull request #22 from jfromaniello/check_image_locally
check if the image is locally, otherwise pull it
2 parents d3454f4 + ffb549b commit e611a95

File tree

3 files changed

+59
-7
lines changed

3 files changed

+59
-7
lines changed

lib/create-container.js

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,45 @@ var stream = require('stream');
22
var EventEmitter = require('events').EventEmitter;
33
var es = require('event-stream')
44
var debug = require('debug')('strider-docker-runner:create-container')
5-
5+
var async = require('async');
66
var demuxer = require('./demuxer')
7+
var inspect = require('util').inspect;
78

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) {
944
docker.createContainer(createOptions, function (err, container) {
1045
if (err) return done(new Error(err));
1146
debug('[runner:docker] container id', container.id)
@@ -83,3 +118,20 @@ module.exports = function (createOptions, docker, config, done) {
83118
}
84119
})
85120
}
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+
}

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"author": "Jared Forsyth <[email protected]>",
2727
"license": "MIT",
2828
"dependencies": {
29+
"async": "~0.9.0",
2930
"debug": "^1.0.4",
3031
"dockerode": "^2.0.1",
3132
"dockerode-optionator": "^1.0.0",

test/test.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,15 @@ function run(spawn, command, args, done) {
2525
})
2626
}
2727

28-
init(null, null, function (err, docker) {
29-
createSlave(docker, {}, function (err, spawn, kill) {
28+
init({}, function (err, docker) {
29+
createSlave(docker, {
30+
image: 'strider/strider-docker-slave'
31+
}, function (err, spawn, kill) {
3032
if (err) {
3133
throw err
3234
}
3335
var command = 'git'
3436
var args = ['clone', 'https://github.com/notablemind/loco.git', '.']
35-
var command = 'sh'
36-
var args = ['-c', 'echo ho && sleep 30 && echo hi']
37-
var args = ['-c', 'git clone https://github.com/notablemind/loco.git . && ls']
3837
run(spawn, command, args, function () {
3938
run(spawn, 'echo', ['hello'], function () {
4039
process.exit(0)

0 commit comments

Comments
 (0)