aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md77
-rw-r--r--package.json4
-rw-r--r--src/lib/index.js140
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