From 15f294f270b2f0b65a83c16f1f25738b9b03fdc8 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Thu, 5 Oct 2017 01:52:35 +0400 Subject: Realization of the basic functionality of creating the container --- README.md | 77 ++++++++++++++++++++++++++++-- package.json | 4 +- src/lib/index.js | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 215 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a901a5e..38eeab9 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![Codacy Coverage Badge](https://api.codacy.com/project/badge/Coverage/286921416577421c98e5f77ce400926c)](https://www.codacy.com/app/valentineus/simple-container/files) [![Gitter Badge](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/valentineus/simple-container) -Simple and fast work with the Docker container +Simple and fast work with the Docker container. ## Installation ```bash @@ -13,16 +13,85 @@ npm install --save simple-container ``` ## Using +A simple example: ```JavaScript import Container from 'simple-container'; -var container = new Container({}); -container.create(); +var container = new Container(); + +/* Create the container */ +container.create('postgres:alpine'); + +/* Start the container */ +container.start(); + +/* Stop and destroy the container */ +container.destroy(); +``` + +### Remote connection +By default, the local service is used. + +For example, if you want to use connection settings: +```JavaScript +var container = new Container({ + host: '127.0.0.1', + port: 3000 +}); +``` + +Examples and details in +[the documentation](https://github.com/apocas/dockerode#getting-started). + +### Creating a container +You can create a container in two ways. + +A simple way - to specify the name of the image: +```JavaScript +container.create('hello-world:latest'); +``` + +Another way - to provide an object with parameters: +```JavaScript +container.create({ + Image: 'postgres:alpine', + Env: ['POSTGRES_PASSWORD = password'], + Ports: [{ + IP: '0.0.0.0', + PrivatePort: 5432, + PublicPort: 5432, + Type: 'tcp' + }] +}); ``` +Examples and details in +[the documentation](https://github.com/apocas/dockerode#manipulating-a-container). + +An additional example of obtaining a private image: +```JavaScript +var auth = { + username: 'username', + password: 'password', + email: 'email@example.org', + serveraddress: 'https://index.docker.io/v1' +}; + +container.create({ + Image: 'project:latest', + authconfig: auth +}); +``` + +Details in +[the documentation](https://github.com/apocas/dockerode#pull-from-private-repos). + +## Debugging +Use the `DEBUG` variable with the `container` option. + ## License [![JavaScript Style Guide](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/eslint/eslint) [MIT](LICENSE.md). Copyright (c) -[Valentin Popov](https://valentineus.link/). \ No newline at end of file +[Valentin Popov](mailto:info@valentineus.link). \ No newline at end of file diff --git a/package.json b/package.json index af90cf5..c95c1e2 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,9 @@ "mocha": "^4.0.0" }, "dependencies": { - "ancient-funicular": "^3.0.0" + "ancient-funicular": "^3.0.0", + "debug": "^3.1.0", + "dockerode": "^2.5.1" }, "scripts": { "test": "mocha src/tests/index.js --require babel-core/register", diff --git a/src/lib/index.js b/src/lib/index.js index 2686a97..6f75695 100644 --- a/src/lib/index.js +++ b/src/lib/index.js @@ -1,3 +1,141 @@ import { Item } from 'ancient-funicular'; +import createDebug from 'debug'; +import Docker from 'dockerode'; +import { statSync } from 'fs'; -export class Container extends Item {}; \ No newline at end of file +/** + * @class Container + */ +export default class Container extends Item { + /** + * @constructs Container + * @param {Object} options + */ + constructor(options) { + super(); + + /** + * @protected + * @type {Object} + * @description + */ + this._docker = null; + + if (this._isObject(options)) { + this._docker = new Docker(options); + } + else { + var socket = process.env.DOCKER_SOCKET || '/var/run/docker.sock'; + var stats = statSync(socket); + + if (!stats.isSocket()) { + throw new Error(''); + } + + this._docker = new Docker({ + socketPath: socket + }); + } + } + + /** + * @protected + * @param {Object|String} options + * @description + */ + create(options) { + var self = this; + var name = null; + + if (!self._isString(options) && !self._isObject(options)) { + throw new Error('The variable \'options\' is not correct.'); + } + + if (self._isString(options)) { + name = options; + options = { Image: name }; + } + + if (self._isObject(options)) { + name = options.Image; + } + + self._pullImage(name, (error) => { + self._handlerError(error); + self._createContainer(options); + }); + } + + /** + * @protected + * @description + */ + destroy() {} + + /** + * @protected + * @param {String} name + * @param {Function} callback + * @description + */ + _pullImage(name, callback) { + var self = this; + self._docker.pull(name).then(stream => { + self._docker.modem.followProgress(stream, callback, self.debug); + }).catch(error => self._handlerError(error)); + } + + /** + * @protected + * @param {Object} options + * @description + */ + _createContainer(options) { + var self = this; + self._docker.createContainer(options).then(container => { + /* @todo Регистрация класса */ + }).catch(error => self._handlerError(error)); + } + + /** + * @protected + * @param {*} value - The variable to check + * @returns {Boolean} Result of checking + * @description Checks the type of the variable + */ + _isString(value) { + return typeof value === 'string'; + } + + /** + * @protected + * @param {*} value - The variable to check + * @returns {Boolean} Result of checking + * @description Checks the type of the variable + */ + _isObject(value) { + return typeof value === 'object'; + } + + /** + * @protected + * @param {*} error + * @description + */ + _handlerError(error) { + if (!!error) { + throw new Error(error); + } + } + + /** + * @protected + * @param {*} + * @description + */ + debug() { + var args = Array.prototype.slice.call(arguments); + var debug = createDebug('container'); + debug.apply(null, args); + } +} \ No newline at end of file -- cgit v1.2.3