UNPKG

@apiclient.xyz/docker

Version:

Provides easy communication with Docker remote API from Node.js, with TypeScript support.

170 lines 13.4 kB
import * as plugins from './plugins.js'; import * as interfaces from './interfaces/index.js'; import { DockerHost } from './classes.host.js'; import { DockerImage } from './classes.image.js'; import { DockerSecret } from './classes.secret.js'; import { logger } from './logger.js'; export class DockerService { // STATIC static async getServices(dockerHost) { const services = []; const response = await dockerHost.request('GET', '/services'); for (const serviceObject of response.body) { const dockerService = new DockerService(dockerHost); Object.assign(dockerService, serviceObject); services.push(dockerService); } return services; } static async getServiceByName(dockerHost, networkName) { const allServices = await DockerService.getServices(dockerHost); const wantedService = allServices.find((service) => { return service.Spec.Name === networkName; }); return wantedService; } /** * creates a service */ static async createService(dockerHost, serviceCreationDescriptor) { // lets get the image logger.log('info', `now creating service ${serviceCreationDescriptor.name}`); // await serviceCreationDescriptor.image.pullLatestImageFromRegistry(); const serviceVersion = await serviceCreationDescriptor.image.getVersion(); const labels = { ...serviceCreationDescriptor.labels, version: serviceVersion, }; const mounts = []; if (serviceCreationDescriptor.accessHostDockerSock) { mounts.push({ Target: '/var/run/docker.sock', Source: '/var/run/docker.sock', Consistency: 'default', ReadOnly: false, Type: 'bind', }); } if (serviceCreationDescriptor.resources && serviceCreationDescriptor.resources.volumeMounts) { for (const volumeMount of serviceCreationDescriptor.resources.volumeMounts) { mounts.push({ Target: volumeMount.containerFsPath, Source: volumeMount.hostFsPath, Consistency: 'default', ReadOnly: false, Type: 'bind', }); } } const networkArray = []; for (const network of serviceCreationDescriptor.networks) { networkArray.push({ Target: network.Name, Aliases: [serviceCreationDescriptor.networkAlias], }); } const ports = []; for (const port of serviceCreationDescriptor.ports) { const portArray = port.split(':'); const hostPort = portArray[0]; const containerPort = portArray[1]; ports.push({ Protocol: 'tcp', PublishedPort: parseInt(hostPort, 10), TargetPort: parseInt(containerPort, 10), }); } // lets configure secrets const secretArray = []; for (const secret of serviceCreationDescriptor.secrets) { secretArray.push({ File: { Name: 'secret.json', // TODO: make sure that works with multiple secrets UID: '33', GID: '33', Mode: 384, }, SecretID: secret.ID, SecretName: secret.Spec.Name, }); } // lets configure limits const memoryLimitMB = serviceCreationDescriptor.resources && serviceCreationDescriptor.resources.memorySizeMB ? serviceCreationDescriptor.resources.memorySizeMB : 1000; const limits = { MemoryBytes: memoryLimitMB * 1000000, }; if (serviceCreationDescriptor.resources) { limits.MemoryBytes = serviceCreationDescriptor.resources.memorySizeMB * 1000000; } const response = await dockerHost.request('POST', '/services/create', { Name: serviceCreationDescriptor.name, TaskTemplate: { ContainerSpec: { Image: serviceCreationDescriptor.image.RepoTags[0], Labels: labels, Secrets: secretArray, Mounts: mounts, /* DNSConfig: { Nameservers: ['1.1.1.1'] } */ }, UpdateConfig: { Parallelism: 0, Delay: 0, FailureAction: 'pause', Monitor: 15000000000, MaxFailureRatio: 0.15, }, ForceUpdate: 1, Resources: { Limits: limits, }, LogDriver: { Name: 'json-file', Options: { 'max-file': '3', 'max-size': '10M', }, }, }, Labels: labels, Networks: networkArray, EndpointSpec: { Ports: ports, }, }); const createdService = await DockerService.getServiceByName(dockerHost, serviceCreationDescriptor.name); return createdService; } constructor(dockerHostArg) { this.dockerHostRef = dockerHostArg; } async remove() { await this.dockerHostRef.request('DELETE', `/services/${this.ID}`); } async reReadFromDockerEngine() { const dockerData = await this.dockerHostRef.request('GET', `/services/${this.ID}`); // TODO: Better assign: Object.assign(this, dockerData); } async needsUpdate() { // TODO: implement digest based update recognition await this.reReadFromDockerEngine(); const dockerImage = await DockerImage.createFromRegistry(this.dockerHostRef, { creationObject: { imageUrl: this.Spec.TaskTemplate.ContainerSpec.Image, } }); const imageVersion = new plugins.smartversion.SmartVersion(dockerImage.Labels.version); const serviceVersion = new plugins.smartversion.SmartVersion(this.Spec.Labels.version); if (imageVersion.greaterThan(serviceVersion)) { console.log(`service ${this.Spec.Name} needs to be updated`); return true; } else { console.log(`service ${this.Spec.Name} is up to date.`); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sdUJBQXVCLENBQUM7QUFFcEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVyQyxNQUFNLE9BQU8sYUFBYTtJQUN4QixTQUFTO0lBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsVUFBc0I7UUFDcEQsTUFBTSxRQUFRLEdBQW9CLEVBQUUsQ0FBQztRQUNyQyxNQUFNLFFBQVEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzlELEtBQUssTUFBTSxhQUFhLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFDLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQzVDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUNsQyxVQUFzQixFQUN0QixXQUFtQjtRQUVuQixNQUFNLFdBQVcsR0FBRyxNQUFNLGFBQWEsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsTUFB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