Skip to content

Commit 9de1dbd

Browse files
authored
Merge pull request #12 from dani8art/#5
Changed from .exec to .spawn. fixed #5
2 parents 38218af + d06d01f commit 9de1dbd

File tree

8 files changed

+261
-117
lines changed

8 files changed

+261
-117
lines changed

.jshintrc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"bitwise": true,
33
"browser": true,
44
"camelcase": false,
5-
"curly": true,
5+
"curly": false,
66
"loopfunc": true,
77
"eqeqeq": false,
88
"immed": true,
@@ -20,7 +20,6 @@
2020
"esversion": 6,
2121
"validthis": true,
2222
"eqnull": true,
23-
2423
"globals": {
2524
"module": true,
2625
"describe": true,

package.json

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,45 @@
11
{
2-
"name": "docker-composer-manager",
3-
"buildOn": "2017-03-30",
4-
"version": "0.0.3",
5-
"description": "A NPM module to manage docker containers using docker-compose",
6-
"homepage": "https://github.com/dani8art/docker-compose-manager",
7-
"main": "index.js",
8-
"scripts": {
9-
"test": "echo \"Error: no test specified\" && exit 1"
10-
},
11-
"dependencies": {
12-
"bluebird": "^3.4.7"
13-
},
14-
"devDependencies": {
15-
"chai": "^3.5.0",
16-
"grunt": "^1.0.1",
17-
"grunt-banner": "^0.6.0",
18-
"grunt-contrib-jshint": "^1.1.0",
19-
"grunt-contrib-watch": "^1.0.0",
20-
"grunt-header": "^1.1.0",
21-
"grunt-mocha-test": "^0.13.2",
22-
"grunt-release-github": "1.0.4",
23-
"mocha": "^3.2.0"
24-
},
25-
"repository": {
26-
"type": "git",
27-
"url": "git://github.com/dani8art/docker-compose-manager.git",
28-
"github": "http://github.com/dani8art/docker-compose-manager"
29-
},
30-
"bugs": {
31-
"url": "https://github.com/dani8art/docker-compose-manager/issues"
32-
},
33-
"keywords": [
34-
"npm",
35-
"docker-management",
36-
"docker",
37-
"docker-compose",
38-
"nodejs"
39-
],
40-
"author": {
41-
"name": "Daniel Arteaga",
42-
"web": "http://darteaga.com"
43-
},
44-
"license": "GPL-3.0+"
45-
}
2+
"name": "docker-composer-manager",
3+
"buildOn": "2017-03-30",
4+
"version": "0.0.3",
5+
"description": "A NPM module to manage docker containers using docker-compose",
6+
"homepage": "https://github.com/dani8art/docker-compose-manager",
7+
"main": "index.js",
8+
"scripts": {
9+
"test": "echo \"Error: no test specified\" && exit 1"
10+
},
11+
"dependencies": {
12+
"bluebird": "^3.5.0"
13+
},
14+
"devDependencies": {
15+
"chai": "^3.5.0",
16+
"grunt": "^1.0.1",
17+
"grunt-banner": "^0.6.0",
18+
"grunt-contrib-jshint": "^1.1.0",
19+
"grunt-contrib-watch": "^1.0.0",
20+
"grunt-header": "^1.1.0",
21+
"grunt-mocha-test": "^0.13.2",
22+
"grunt-release-github": "1.0.4",
23+
"mocha": "^3.2.0"
24+
},
25+
"repository": {
26+
"type": "git",
27+
"url": "git://github.com/dani8art/docker-compose-manager.git",
28+
"github": "http://github.com/dani8art/docker-compose-manager"
29+
},
30+
"bugs": {
31+
"url": "https://github.com/dani8art/docker-compose-manager/issues"
32+
},
33+
"keywords": [
34+
"npm",
35+
"docker-management",
36+
"docker",
37+
"docker-compose",
38+
"nodejs"
39+
],
40+
"author": {
41+
"name": "Daniel Arteaga",
42+
"web": "http://darteaga.com"
43+
},
44+
"license": "GPL-3.0+"
45+
}

src/cmd/cmd.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
'use strict';
2+
3+
/**
4+
* Command line interface
5+
* @module docker-compose-manager/cmd
6+
*/
7+
8+
var spawn = require('child_process').spawn,
9+
logger = require('../logger/logger'),
10+
Promise = require('bluebird');
11+
12+
module.exports = {
13+
/**
14+
* Method for execute command
15+
* @param {string} command - The command to be executed.
16+
* @param {object} options - Options object.
17+
* @return {Promise} A promise.
18+
*/
19+
execCommand: (command, options) => {
20+
return new Promise((resolve, reject) => {
21+
var cmd;
22+
try {
23+
cmd = spawn(command, options);
24+
resolve(cmd);
25+
} catch (e) {
26+
reject(e);
27+
}
28+
});
29+
}
30+
};

src/docker-compose-manager.js

Lines changed: 93 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -19,92 +19,114 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.*/
1919

2020
'use strict';
2121

22-
var child_process = require('child_process');
23-
24-
module.exports.dockerComposeUp = function (dir, options, success, error) {
25-
var command = 'docker-compose up';
26-
27-
if (options) {
28-
command += ' ' + options;
29-
}
30-
31-
_execCommand(command, success, error, {
32-
cwd: dir
22+
var cmd = require('./cmd/cmd');
23+
24+
module.exports = {
25+
dockerComposeUp: dockerComposeUp,
26+
dockerComposeDown: dockerComposeDown,
27+
dockerComposeStop: dockerComposeStop,
28+
dockerComposeStart: dockerComposeStart,
29+
dockerExec: dockerExec,
30+
dockerInspectIPAddressOfContainer: dockerInspectIPAddressOfContainer,
31+
dockerInspectPortOfContainer: dockerInspectPortOfContainer
32+
};
33+
34+
function dockerComposeUp(file, options) {
35+
return new Promise((resolve, reject) => {
36+
options = options ? options : [];
37+
var command = 'docker-compose';
38+
var arg = ['-f', file, 'up', '-d'].concat(options);
39+
40+
cmd.execCommand(command, arg).then(child => {
41+
child.stdout.on('data', data => console.log(data.toString()));
42+
child.stderr.on('data', data => console.log(data.toString()));
43+
child.stdout.on('close', code => { if (!code) resolve(); else reject(code); });
44+
});
3345
});
3446
}
3547

36-
module.exports.dockerComposeDown = function (dir, options, success, error) {
37-
var command = 'docker-compose down';
38-
39-
if (options) {
40-
command += ' ' + options;
41-
}
42-
43-
_execCommand(command, success, error, {
44-
cwd: dir
48+
function dockerComposeDown(file, options) {
49+
return new Promise((resolve, reject) => {
50+
options = options ? options : [];
51+
var command = 'docker-compose';
52+
var arg = ['-f', file, 'down'].concat(options);
53+
54+
cmd.execCommand(command, arg).then(child => {
55+
child.stdout.on('data', data => console.log(data.toString()));
56+
child.stderr.on('data', data => console.log(data.toString()));
57+
child.stdout.on('close', code => { if (!code) resolve(); else reject(code); });
58+
});
4559
});
46-
4760
}
4861

49-
module.exports.dockerComposeStop = function (dir, success, error) {
50-
var command = 'docker-compose stop';
51-
52-
_execCommand(command, success, error, {
53-
cwd: dir
62+
function dockerComposeStop(file, options) {
63+
return new Promise((resolve, reject) => {
64+
options = options ? options : [];
65+
var command = 'docker-compose';
66+
var arg = ['-f', file, 'stop'].concat(options);
67+
68+
cmd.execCommand(command, arg).then(child => {
69+
child.stdout.on('data', data => console.log(data.toString()));
70+
child.stderr.on('data', data => console.log(data.toString()));
71+
child.stdout.on('close', code => { if (!code) resolve(); else reject(code); });
72+
});
5473
});
55-
5674
}
5775

58-
module.exports.dockerComposeStart = function (dir, success, error) {
59-
var command = 'docker-compose start';
60-
61-
_execCommand(command, success, error, {
62-
cwd: dir
76+
function dockerComposeStart(file, options) {
77+
return new Promise((resolve, reject) => {
78+
options = options ? options : [];
79+
var command = 'docker-compose';
80+
var arg = ['-f', file, 'start'].concat(options);
81+
82+
cmd.execCommand(command, arg).then(child => {
83+
child.stdout.on('data', data => console.log(data.toString()));
84+
child.stderr.on('data', data => console.log(data.toString()));
85+
child.stdout.on('close', code => { if (!code) resolve(); else reject(code); });
86+
});
6387
});
64-
65-
}
66-
67-
module.exports.dockerExec = function (container, exec_command, options, success, error) {
68-
var command = 'docker exec';
69-
70-
if (options) {
71-
for (option in options) {
72-
command += ' ' + options[option];
73-
}
74-
}
75-
76-
command += ' ' + container;
77-
78-
command += ' ' + exec_command;
79-
80-
_execCommand(command, success, error);
81-
8288
}
8389

84-
module.exports.dockerInspectIPAddressOfContainer = function (container, options) {
85-
var command = "docker inspect --format '{{.NetworkSettings.Networks." + options.network + ".IPAddress}}' " + container;
86-
87-
return child_process.execSync(command).toString('utf-8').replace(/(?:\r\n|\r|\n)/g, '').replace(/'/ig, '');
90+
function dockerExec(container, exec_command, options) {
91+
return new Promise((resolve, reject) => {
92+
options = options ? options : [];
93+
var command = 'docker';
94+
var arg = ['exec'].concat(options).concat(container).concat(exec_command);
95+
96+
cmd.execCommand(command, arg).then(child => {
97+
child.stdout.on('data', data => console.log(data.toString()));
98+
child.stderr.on('data', data => console.log(data.toString()));
99+
child.stdout.on('close', code => { if (!code) resolve(); else reject(code); });
100+
});
101+
});
88102
}
89103

90-
module.exports.dockerInspectPortOfContainer = function (container, options) {
91-
var command = "docker inspect --format '{{.NetworkSettings.Ports}}' " + container;
92-
93-
return child_process.execSync(command).toString('utf-8').replace(/(?:\r\n|\r|\n)/g, '').split("[")[1].split("/")[0].replace(/'/ig, '');
104+
function dockerInspectIPAddressOfContainer(container, options) {
105+
return new Promise((resolve, reject) => {
106+
options = options ? options : [];
107+
var command = 'docker';
108+
var arg = ['inspect', '--format', "'{{.NetworkSettings.Networks." + options.network + ".IPAddress}}'", container];
109+
110+
var ip;
111+
cmd.execCommand(command, arg).then(child => {
112+
child.stdout.on('data', data => ip = data.toString('utf-8').replace(/(?:\r\n|\r|\n)/g, '').replace(/'/ig, ''));
113+
child.stderr.on('data', data => console.log(data.toString()));
114+
child.stdout.on('close', code => { if (!code) resolve(ip); else reject(code); });
115+
});
116+
});
94117
}
95118

96-
function _execCommand(command, success, error, options) {
97-
98-
child_process.exec(command, options, function (err, stdout, stderr) {
99-
if (!err) {
100-
if (success)
101-
success(stdout, stderr);
102-
} else {
103-
if (error)
104-
error(err, stderr);
105-
}
119+
function dockerInspectPortOfContainer(container) {
120+
return new Promise((resolve, reject) => {
121+
// options = options ? options : [];
122+
var command = 'docker';
123+
var arg = ['inspect', '--format', "'{{.NetworkSettings.Ports}}'", container];
124+
125+
var port;
126+
cmd.execCommand(command, arg).then(child => {
127+
child.stdout.on('data', data => port = data.toString('utf-8').replace(/(?:\r\n|\r|\n)/g, '').split("[")[1].split("/")[0].replace(/'/ig, ''));
128+
child.stderr.on('data', data => console.log(data.toString()));
129+
child.stdout.on('close', code => { if (!code) resolve(port); else reject(code); });
130+
});
106131
});
107-
108132
}
109-
110-
module.exports.execCommand = _execCommand;

src/logger/logger.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
'use strict';
2+
3+
/**
4+
* Command line interface
5+
* @module docker-compose-manager/logger
6+
*/
7+
8+
var winston = require('winston');
9+
10+
/**
11+
* Configure here your custom levels.
12+
* */
13+
var customLeves = {
14+
levels: {
15+
error: 7,
16+
warning: 8,
17+
custom: 9,
18+
info: 12,
19+
debug: 13
20+
},
21+
colors: {
22+
error: 'red',
23+
warning: 'yellow',
24+
custom: 'magenta',
25+
info: 'white',
26+
debug: 'black'
27+
}
28+
};
29+
30+
winston.emitErrs = true;
31+
32+
var logger = new winston.Logger({
33+
levels: customLeves.levels,
34+
colors: customLeves.colors,
35+
transports: [
36+
new winston.transports.Console({
37+
level: 'info',
38+
handleExceptions: true,
39+
json: false,
40+
colorize: true,
41+
timestamp: true
42+
})
43+
],
44+
exitOnError: false
45+
});
46+
47+
/*
48+
* Export functions and Objects
49+
*/
50+
module.exports = logger;

tests/docker-compose.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
version: '2'
2+
services:
3+
mongo:
4+
image: mongo

0 commit comments

Comments
 (0)