diff --git a/lib/create-container.js b/lib/create-container.js index a14c7ab..d4a07b8 100644 --- a/lib/create-container.js +++ b/lib/create-container.js @@ -2,10 +2,45 @@ var stream = require('stream'); var EventEmitter = require('events').EventEmitter; var es = require('event-stream') var debug = require('debug')('strider-docker-runner:create-container') - +var async = require('async'); var demuxer = require('./demuxer') +var inspect = require('util').inspect; -module.exports = function (createOptions, docker, config, done) { +function isImageLocally(docker, image, done) { + var withoutTag = image.split(':')[0]; + var fullname = image === withoutTag ? + image + ':latest' : + image; + + docker.listImages({ filter: withoutTag }, function (err, images) { + if (err) return done(err); + + var found = images.some(function (img) { + return ~img.RepoTags.indexOf(fullname); + }); + + done(null, found); + }); +} + +function pull (docker, image, done) { + docker.pull(image, function (err, streamc) { + if (err) return done(err) + + streamc + .pipe(es.map(function (data, cb) { + cb(null, JSON.parse(data)) + })) + .on('data', function (event) { + debug('pull event: ' + inspect(event)); + }) + .on('end', function () { + done(); + }); + }); +} + +function create (createOptions, docker, config, done) { docker.createContainer(createOptions, function (err, container) { if (err) return done(new Error(err)); debug('[runner:docker] container id', container.id) @@ -83,3 +118,20 @@ module.exports = function (createOptions, docker, config, done) { } }) } + +module.exports = function (createOptions, docker, config, done) { + async.waterfall([ + function (callback) { + isImageLocally(docker, createOptions.Image, callback); + }, function (isLocally, callback) { + if (isLocally) { + debug('image is already locally') + return callback(); + } + debug('Unable to find image "%s" locally', createOptions.Image); + pull(docker, createOptions.Image, callback); + }, function () { + create(createOptions, docker, config, done) + } + ]); +} \ No newline at end of file diff --git a/package.json b/package.json index 6ff61d7..ec52990 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "author": "Jared Forsyth ", "license": "MIT", "dependencies": { + "async": "~0.9.0", "debug": "^1.0.4", "dockerode": "^2.0.1", "dockerode-optionator": "^1.0.0", diff --git a/test/test.js b/test/test.js index 6ea8bbf..b8fcd33 100644 --- a/test/test.js +++ b/test/test.js @@ -25,16 +25,15 @@ function run(spawn, command, args, done) { }) } -init(null, null, function (err, docker) { - createSlave(docker, {}, function (err, spawn, kill) { +init({}, function (err, docker) { + createSlave(docker, { + image: 'strider/strider-docker-slave' + }, function (err, spawn, kill) { if (err) { throw err } var command = 'git' var args = ['clone', 'https://github.com/notablemind/loco.git', '.'] - var command = 'sh' - var args = ['-c', 'echo ho && sleep 30 && echo hi'] - var args = ['-c', 'git clone https://github.com/notablemind/loco.git . && ls'] run(spawn, command, args, function () { run(spawn, 'echo', ['hello'], function () { process.exit(0)