docker-composter
Advanced tools
Comparing version 1.1.1 to 1.2.0
@@ -29,2 +29,15 @@ "use strict"; | ||
this._logger.groupEnd(); // connect external containers to network | ||
this._logger.group('connecting external containers'); | ||
await Promise.all(this.removeDuplicates(Object.keys(config.networks)).reduce((acc, val) => { | ||
if (config.networks[val].externalContainers) { | ||
acc = acc.concat(config.networks[val].externalContainers.map(elem => this._docker.connectContainerToNetwork(elem, val))); | ||
} | ||
return acc; | ||
}, [])); | ||
this._logger.groupEnd(); // ensure containers exist | ||
@@ -64,2 +77,15 @@ | ||
this._logger.groupEnd(); // disconnect external containers to network | ||
this._logger.group('disconnecting external containers'); | ||
await Promise.all(this.removeDuplicates(Object.keys(config.networks)).reduce((acc, val) => { | ||
if (config.networks[val].externalContainers) { | ||
acc = acc.concat(config.networks[val].externalContainers.map(elem => this._docker.disconnectContainerFromNetwork(elem, val))); | ||
} | ||
return acc; | ||
}, [])); | ||
this._logger.groupEnd(); // ensure all non-external networks, transient volumes, and dangling images are removed | ||
@@ -66,0 +92,0 @@ |
@@ -257,5 +257,14 @@ "use strict"; | ||
return; | ||
} | ||
} // get list of containers | ||
if (image.Containers > 0) { | ||
const usedImageIds = (await this._request({ | ||
method: 'get', | ||
url: '/containers/json', | ||
params: { | ||
all: true | ||
} | ||
})).data.map(elem => elem.ImageID); | ||
if (usedImageIds.includes(image.Id)) { | ||
this._logger.info(`image "${imageName}" is still in use`); | ||
@@ -274,4 +283,50 @@ | ||
async connectContainerToNetwork(containerName, networkName) { | ||
const connectedContainers = Object.values((await this._request({ | ||
method: 'get', | ||
url: `/networks/${networkName}` | ||
})).data.Containers).map(elem => elem.Name); | ||
if (connectedContainers.includes(containerName)) { | ||
this._logger.info(`container "${containerName}" is connected to network "${networkName}"`); | ||
return; | ||
} | ||
await this._request({ | ||
method: 'post', | ||
url: `/networks/${networkName}/connect`, | ||
data: { | ||
Container: containerName | ||
} | ||
}); | ||
this._logger.info(`connected container "${containerName}" to network "${networkName}"`); | ||
} | ||
async disconnectContainerFromNetwork(containerName, networkName) { | ||
const connectedContainers = Object.values((await this._request({ | ||
method: 'get', | ||
url: `/networks/${networkName}` | ||
})).data.Containers).map(elem => elem.Name); | ||
if (!connectedContainers.includes(containerName)) { | ||
this._logger.info(`container "${containerName}" is not connected to network "${networkName}"`); | ||
return; | ||
} | ||
await this._request({ | ||
method: 'post', | ||
url: `/networks/${networkName}/disconnect`, | ||
data: { | ||
Container: containerName | ||
} | ||
}); | ||
this._logger.info(`disconnected container "${containerName}" from network "${networkName}"`); | ||
} | ||
} | ||
exports.Docker = Docker; |
{ | ||
"name": "docker-composter", | ||
"version": "1.1.1", | ||
"version": "1.2.0", | ||
"description": "A deployment tool for Docker containers.", | ||
@@ -5,0 +5,0 @@ "main": "bld/index.js", |
@@ -69,2 +69,3 @@  | ||
* type (optional, "external"): type of the network; "external" networks will not be removed when the command "down" is issued. | ||
* externalContainers (optional, array\[string]): an array of names or ids of containers, which are not listed in the configuration, but should be connected to the network. | ||
* config (optional, object): an object as described in the [Docker API](https://docs.docker.com/engine/api/v1.40/#operation/NetworkCreate); "Name" will be replaced by the name of the network as given in the networks object. | ||
@@ -71,0 +72,0 @@ |
@@ -25,2 +25,12 @@ export class Composter { | ||
this._logger.groupEnd(); | ||
// connect external containers to network | ||
this._logger.group('connecting external containers'); | ||
await Promise.all(this.removeDuplicates(Object.keys(config.networks)).reduce((acc, val) => { | ||
if (config.networks[val].externalContainers) { | ||
acc = acc.concat(config.networks[val].externalContainers.map(elem => this._docker.connectContainerToNetwork(elem, val))); | ||
} | ||
return acc; | ||
}, [])); | ||
this._logger.groupEnd(); | ||
// ensure containers exist | ||
@@ -53,2 +63,12 @@ this._logger.group('creating containers'); | ||
this._logger.groupEnd(); | ||
// disconnect external containers to network | ||
this._logger.group('disconnecting external containers'); | ||
await Promise.all(this.removeDuplicates(Object.keys(config.networks)).reduce((acc, val) => { | ||
if (config.networks[val].externalContainers) { | ||
acc = acc.concat(config.networks[val].externalContainers.map(elem => this._docker.disconnectContainerFromNetwork(elem, val))); | ||
} | ||
return acc; | ||
}, [])); | ||
this._logger.groupEnd(); | ||
// ensure all non-external networks, transient volumes, and dangling images are removed | ||
@@ -55,0 +75,0 @@ this._logger.group('removing networks, volumes, and images'); |
@@ -219,3 +219,10 @@ export class Docker { | ||
if (image.Containers > 0) { | ||
// get list of containers | ||
const usedImageIds = (await this._request({ | ||
method: 'get', | ||
url: '/containers/json', | ||
params: {all: true} | ||
})).data.map(elem => elem.ImageID); | ||
if (usedImageIds.includes(image.Id)) { | ||
this._logger.info(`image "${imageName}" is still in use`); | ||
@@ -231,2 +238,40 @@ return; | ||
} | ||
async connectContainerToNetwork(containerName, networkName) { | ||
const connectedContainers = Object.values((await this._request({ | ||
method: 'get', | ||
url: `/networks/${networkName}` | ||
})).data.Containers).map(elem => elem.Name); | ||
if (connectedContainers.includes(containerName)) { | ||
this._logger.info(`container "${containerName}" is connected to network "${networkName}"`); | ||
return; | ||
} | ||
await this._request({ | ||
method: 'post', | ||
url: `/networks/${networkName}/connect`, | ||
data: {Container: containerName} | ||
}); | ||
this._logger.info(`connected container "${containerName}" to network "${networkName}"`); | ||
} | ||
async disconnectContainerFromNetwork(containerName, networkName) { | ||
const connectedContainers = Object.values((await this._request({ | ||
method: 'get', | ||
url: `/networks/${networkName}` | ||
})).data.Containers).map(elem => elem.Name); | ||
if (!connectedContainers.includes(containerName)) { | ||
this._logger.info(`container "${containerName}" is not connected to network "${networkName}"`); | ||
return; | ||
} | ||
await this._request({ | ||
method: 'post', | ||
url: `/networks/${networkName}/disconnect`, | ||
data: {Container: containerName} | ||
}); | ||
this._logger.info(`disconnected container "${containerName}" from network "${networkName}"`); | ||
} | ||
} |
35171
761
114