testcontainers 9.2.0 → 9.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +1 -1
- package/dist/src/bound-ports.d.ts +12 -0
- package/dist/src/bound-ports.js +50 -0
- package/dist/src/clock.d.ts +7 -0
- package/dist/src/clock.js +9 -0
- package/dist/src/docker/docker-client-config.d.ts +10 -0
- package/dist/src/docker/docker-client-config.js +66 -0
- package/dist/src/docker/docker-client.d.ts +24 -0
- package/dist/src/docker/docker-client.js +198 -0
- package/dist/src/docker/functions/container/attach-container.d.ts +3 -0
- package/dist/src/docker/functions/container/attach-container.js +25 -0
- package/dist/src/docker/functions/container/container-logs.d.ts +6 -0
- package/dist/src/docker/functions/container/container-logs.js +32 -0
- package/dist/src/docker/functions/container/create-container.d.ts +30 -0
- package/dist/src/docker/functions/container/create-container.js +114 -0
- package/dist/src/docker/functions/container/exec-container.d.ts +9 -0
- package/dist/src/docker/functions/container/exec-container.js +59 -0
- package/dist/src/docker/functions/container/get-container.d.ts +3 -0
- package/dist/src/docker/functions/container/get-container.js +49 -0
- package/dist/src/docker/functions/container/inspect-container.d.ts +19 -0
- package/dist/src/docker/functions/container/inspect-container.js +67 -0
- package/dist/src/docker/functions/container/list-containers.d.ts +2 -0
- package/dist/src/docker/functions/container/list-containers.js +25 -0
- package/dist/src/docker/functions/container/put-container-archive.d.ts +9 -0
- package/dist/src/docker/functions/container/put-container-archive.js +23 -0
- package/dist/src/docker/functions/container/remove-container.d.ts +5 -0
- package/dist/src/docker/functions/container/remove-container.js +23 -0
- package/dist/src/docker/functions/container/restart-container.d.ts +5 -0
- package/dist/src/docker/functions/container/restart-container.js +23 -0
- package/dist/src/docker/functions/container/start-container.d.ts +2 -0
- package/dist/src/docker/functions/container/start-container.js +23 -0
- package/dist/src/docker/functions/container/stop-container.d.ts +5 -0
- package/dist/src/docker/functions/container/stop-container.js +29 -0
- package/dist/src/docker/functions/create-labels.d.ts +3 -0
- package/dist/src/docker/functions/create-labels.js +17 -0
- package/dist/src/docker/functions/demux-stream.d.ts +3 -0
- package/dist/src/docker/functions/demux-stream.js +32 -0
- package/dist/src/docker/functions/get-info.d.ts +11 -0
- package/dist/src/docker/functions/get-info.js +38 -0
- package/dist/src/docker/functions/image/build-image.d.ts +13 -0
- package/dist/src/docker/functions/image/build-image.js +76 -0
- package/dist/src/docker/functions/image/image-exists.d.ts +3 -0
- package/dist/src/docker/functions/image/image-exists.js +34 -0
- package/dist/src/docker/functions/image/list-images.d.ts +3 -0
- package/dist/src/docker/functions/image/list-images.js +34 -0
- package/dist/src/docker/functions/image/pull-image.d.ts +7 -0
- package/dist/src/docker/functions/image/pull-image.js +41 -0
- package/dist/src/docker/functions/network/connect-network.d.ts +6 -0
- package/dist/src/docker/functions/network/connect-network.js +27 -0
- package/dist/src/docker/functions/network/create-network.d.ts +16 -0
- package/dist/src/docker/functions/network/create-network.js +38 -0
- package/dist/src/docker/functions/network/remove-network.d.ts +1 -0
- package/dist/src/docker/functions/network/remove-network.js +30 -0
- package/dist/src/docker/functions/run-in-container.d.ts +2 -0
- package/dist/src/docker/functions/run-in-container.js +39 -0
- package/dist/src/docker/get-remote-docker-unix-socket-path.d.ts +5 -0
- package/dist/src/docker/get-remote-docker-unix-socket-path.js +17 -0
- package/dist/src/docker/lookup-host-ips.d.ts +5 -0
- package/dist/src/docker/lookup-host-ips.js +26 -0
- package/dist/src/docker/pull-stream-parser.d.ts +11 -0
- package/dist/src/docker/pull-stream-parser.js +63 -0
- package/dist/src/docker/rootless-unix-socket-strategy.d.ts +16 -0
- package/dist/src/docker/rootless-unix-socket-strategy.js +69 -0
- package/dist/src/docker/session-id.d.ts +1 -0
- package/dist/src/docker/session-id.js +5 -0
- package/dist/src/docker/types.d.ts +79 -0
- package/dist/src/docker/types.js +2 -0
- package/dist/src/docker-compose/default-docker-compose-options.d.ts +3 -0
- package/dist/src/docker-compose/default-docker-compose-options.js +37 -0
- package/dist/src/docker-compose/docker-compose-options.d.ts +9 -0
- package/dist/src/docker-compose/docker-compose-options.js +2 -0
- package/dist/src/docker-compose/functions/container-name-resolver.d.ts +1 -0
- package/dist/src/docker-compose/functions/container-name-resolver.js +15 -0
- package/dist/src/docker-compose/functions/docker-compose-down.d.ts +3 -0
- package/dist/src/docker-compose/functions/docker-compose-down.js +39 -0
- package/dist/src/docker-compose/functions/docker-compose-stop.d.ts +2 -0
- package/dist/src/docker-compose/functions/docker-compose-stop.js +29 -0
- package/dist/src/docker-compose/functions/docker-compose-up.d.ts +2 -0
- package/dist/src/docker-compose/functions/docker-compose-up.js +41 -0
- package/dist/src/docker-compose-environment/docker-compose-environment.d.ts +25 -0
- package/dist/src/docker-compose-environment/docker-compose-environment.js +134 -0
- package/dist/src/docker-compose-environment/downed-docker-compose-environment.d.ts +2 -0
- package/dist/src/docker-compose-environment/downed-docker-compose-environment.js +6 -0
- package/dist/src/docker-compose-environment/started-docker-compose-environment.d.ts +15 -0
- package/dist/src/docker-compose-environment/started-docker-compose-environment.js +46 -0
- package/dist/src/docker-compose-environment/stopped-docker-compose-environment.d.ts +8 -0
- package/dist/src/docker-compose-environment/stopped-docker-compose-environment.js +27 -0
- package/dist/src/docker-image-name.d.ts +15 -0
- package/dist/src/docker-image-name.js +63 -0
- package/dist/src/dockerfile-parser.d.ts +3 -0
- package/dist/src/dockerfile-parser.js +39 -0
- package/dist/src/generic-container/generic-container-builder.d.ts +18 -0
- package/dist/src/generic-container/generic-container-builder.js +98 -0
- package/dist/src/generic-container/generic-container.d.ts +77 -0
- package/dist/src/generic-container/generic-container.js +312 -0
- package/dist/src/generic-container/started-generic-container.d.ts +31 -0
- package/dist/src/generic-container/started-generic-container.js +97 -0
- package/dist/src/generic-container/stopped-generic-container.d.ts +3 -0
- package/dist/src/generic-container/stopped-generic-container.js +6 -0
- package/dist/src/hash.d.ts +1 -0
- package/dist/src/hash.js +11 -0
- package/dist/src/http-wait-strategy.d.ts +27 -0
- package/dist/src/http-wait-strategy.js +113 -0
- package/dist/src/images.d.ts +2 -0
- package/dist/src/images.js +6 -0
- package/dist/src/index.d.ts +21 -0
- package/dist/src/index.js +54 -0
- package/dist/src/labels.d.ts +5 -0
- package/dist/src/labels.js +8 -0
- package/dist/src/logger.d.ts +36 -0
- package/dist/src/logger.js +61 -0
- package/dist/src/modules/abstract-started-container.d.ts +21 -0
- package/dist/src/modules/abstract-started-container.js +59 -0
- package/dist/src/modules/arangodb/arangodb-container.d.ts +19 -0
- package/dist/src/modules/arangodb/arangodb-container.js +60 -0
- package/dist/src/modules/elasticsearch/elasticsearch-container.d.ts +12 -0
- package/dist/src/modules/elasticsearch/elasticsearch-container.js +43 -0
- package/dist/src/modules/kafka/kafka-container.d.ts +46 -0
- package/dist/src/modules/kafka/kafka-container.js +172 -0
- package/dist/src/modules/mongodb/mongodb-container.d.ts +19 -0
- package/dist/src/modules/mongodb/mongodb-container.js +85 -0
- package/dist/src/modules/mysql/mysql-container.d.ts +29 -0
- package/dist/src/modules/mysql/mysql-container.js +102 -0
- package/dist/src/modules/nats/nats-container.d.ts +55 -0
- package/dist/src/modules/nats/nats-container.js +97 -0
- package/dist/src/modules/neo4j/neo4j-container.d.ts +23 -0
- package/dist/src/modules/neo4j/neo4j-container.js +82 -0
- package/dist/src/modules/postgresql/postgresql-container.d.ts +28 -0
- package/dist/src/modules/postgresql/postgresql-container.js +87 -0
- package/dist/src/network.d.ts +17 -0
- package/dist/src/network.js +54 -0
- package/dist/src/port-check.d.ts +17 -0
- package/dist/src/port-check.js +84 -0
- package/dist/src/port-forwarder.d.ts +17 -0
- package/dist/src/port-forwarder.js +81 -0
- package/dist/src/port-generator.d.ts +15 -0
- package/dist/src/port-generator.js +51 -0
- package/dist/src/port.d.ts +10 -0
- package/dist/src/port.js +47 -0
- package/dist/src/pull-policy.d.ts +9 -0
- package/dist/src/pull-policy.js +15 -0
- package/dist/src/reaper.d.ts +14 -0
- package/dist/src/reaper.js +141 -0
- package/dist/src/registry-auth-locator/auths.d.ts +8 -0
- package/dist/src/registry-auth-locator/auths.js +56 -0
- package/dist/src/registry-auth-locator/cred-helpers.d.ts +6 -0
- package/dist/src/registry-auth-locator/cred-helpers.js +15 -0
- package/dist/src/registry-auth-locator/credential-provider.d.ts +10 -0
- package/dist/src/registry-auth-locator/credential-provider.js +83 -0
- package/dist/src/registry-auth-locator/creds-store.d.ts +6 -0
- package/dist/src/registry-auth-locator/creds-store.js +15 -0
- package/dist/src/registry-auth-locator/get-auth-config.d.ts +2 -0
- package/dist/src/registry-auth-locator/get-auth-config.js +65 -0
- package/dist/src/registry-auth-locator/registry-auth-locator.d.ts +6 -0
- package/dist/src/registry-auth-locator/registry-auth-locator.js +2 -0
- package/dist/src/registry-auth-locator/registry-matches.d.ts +1 -0
- package/dist/src/registry-auth-locator/registry-matches.js +5 -0
- package/dist/src/registry-auth-locator/types.d.ts +23 -0
- package/dist/src/registry-auth-locator/types.js +2 -0
- package/dist/src/retry-strategy.d.ts +17 -0
- package/dist/src/retry-strategy.js +46 -0
- package/dist/src/startup-check-strategy.d.ts +7 -0
- package/dist/src/startup-check-strategy.js +30 -0
- package/dist/src/stream-utils.d.ts +6 -0
- package/dist/src/stream-utils.js +46 -0
- package/dist/src/system-info.d.ts +17 -0
- package/dist/src/system-info.js +51 -0
- package/dist/src/test-container.d.ts +66 -0
- package/dist/src/test-container.js +2 -0
- package/dist/src/test-containers.d.ts +3 -0
- package/dist/src/test-containers.js +22 -0
- package/dist/src/type-guards.d.ts +1 -0
- package/dist/src/type-guards.js +7 -0
- package/dist/src/uuid.d.ts +6 -0
- package/dist/src/uuid.js +13 -0
- package/dist/src/wait-for-container.d.ts +4 -0
- package/dist/src/wait-for-container.js +34 -0
- package/dist/src/wait-strategy.d.ts +32 -0
- package/dist/src/wait-strategy.js +137 -0
- package/dist/src/wait.d.ts +7 -0
- package/dist/src/wait.js +17 -0
- package/package.json +1 -1
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.execContainer = void 0;
|
|
16
|
+
const logger_1 = require("../../../logger");
|
|
17
|
+
const byline_1 = __importDefault(require("byline"));
|
|
18
|
+
const execContainer = (container, command, options, shouldLog = true) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
|
+
const chunks = [];
|
|
20
|
+
try {
|
|
21
|
+
const exec = yield container.exec({
|
|
22
|
+
Cmd: command,
|
|
23
|
+
AttachStdout: true,
|
|
24
|
+
AttachStderr: true,
|
|
25
|
+
});
|
|
26
|
+
const stream = yield startExec(exec, options);
|
|
27
|
+
stream.on("data", (chunk) => chunks.push(chunk));
|
|
28
|
+
if (shouldLog && logger_1.execLog.enabled()) {
|
|
29
|
+
(0, byline_1.default)(stream).on("data", (line) => logger_1.execLog.trace(`${container.id}: ${line}`));
|
|
30
|
+
}
|
|
31
|
+
const exitCode = yield waitForExec(exec, stream);
|
|
32
|
+
stream.destroy();
|
|
33
|
+
return { output: chunks.join(""), exitCode };
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
logger_1.log.error(`Failed to exec container ${container.id} with command "${command.join(" ")}": ${err}. Container output: ${chunks.join("")}`);
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
exports.execContainer = execContainer;
|
|
41
|
+
const startExec = (exec, options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
42
|
+
try {
|
|
43
|
+
const stream = yield exec.start(options);
|
|
44
|
+
stream.setEncoding("utf-8");
|
|
45
|
+
return stream;
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
logger_1.log.error(`Failed to start exec: ${err}`);
|
|
49
|
+
throw err;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
const waitForExec = (exec, stream) => __awaiter(void 0, void 0, void 0, function* () {
|
|
53
|
+
yield new Promise((res, rej) => {
|
|
54
|
+
stream.on("end", res);
|
|
55
|
+
stream.on("error", rej);
|
|
56
|
+
});
|
|
57
|
+
const inspectResult = yield exec.inspect();
|
|
58
|
+
return inspectResult.ExitCode === null ? -1 : inspectResult.ExitCode;
|
|
59
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.getContainerByHash = exports.getContainerById = void 0;
|
|
13
|
+
const docker_client_1 = require("../../docker-client");
|
|
14
|
+
const logger_1 = require("../../../logger");
|
|
15
|
+
const labels_1 = require("../../../labels");
|
|
16
|
+
const getContainerById = (id) => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
|
+
try {
|
|
18
|
+
const { dockerode } = yield (0, docker_client_1.dockerClient)();
|
|
19
|
+
return dockerode.getContainer(id);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
logger_1.log.error(`Failed to get container by ID: ${err}`);
|
|
23
|
+
throw err;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
exports.getContainerById = getContainerById;
|
|
27
|
+
const getContainerByHash = (hash) => __awaiter(void 0, void 0, void 0, function* () {
|
|
28
|
+
try {
|
|
29
|
+
const { dockerode } = yield (0, docker_client_1.dockerClient)();
|
|
30
|
+
const containers = yield dockerode.listContainers({
|
|
31
|
+
limit: 1,
|
|
32
|
+
filters: {
|
|
33
|
+
status: ["running"],
|
|
34
|
+
label: [`${labels_1.LABEL_TESTCONTAINERS_CONTAINER_HASH}=${hash}`],
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
if (containers.length === 0) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
return yield (0, exports.getContainerById)(containers[0].Id);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
logger_1.log.error(`Failed to get container by hash (${hash}): ${err}`);
|
|
46
|
+
throw err;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
exports.getContainerByHash = getContainerByHash;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { HealthCheckStatus, Labels, NetworkSettings, Ports } from "../../types";
|
|
2
|
+
import Dockerode from "dockerode";
|
|
3
|
+
export type InspectResult = {
|
|
4
|
+
name: string;
|
|
5
|
+
hostname: string;
|
|
6
|
+
ports: Ports;
|
|
7
|
+
healthCheckStatus: HealthCheckStatus;
|
|
8
|
+
networkSettings: {
|
|
9
|
+
[networkName: string]: NetworkSettings;
|
|
10
|
+
};
|
|
11
|
+
state: {
|
|
12
|
+
status: string;
|
|
13
|
+
running: boolean;
|
|
14
|
+
startedAt: Date;
|
|
15
|
+
finishedAt: Date | undefined;
|
|
16
|
+
};
|
|
17
|
+
labels: Labels;
|
|
18
|
+
};
|
|
19
|
+
export declare const inspectContainer: (container: Dockerode.Container) => Promise<InspectResult>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.inspectContainer = void 0;
|
|
13
|
+
const logger_1 = require("../../../logger");
|
|
14
|
+
const inspectContainer = (container) => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
+
try {
|
|
16
|
+
const inspectResult = yield container.inspect();
|
|
17
|
+
const finishedAt = new Date(inspectResult.State.FinishedAt);
|
|
18
|
+
return {
|
|
19
|
+
name: inspectResult.Name,
|
|
20
|
+
hostname: inspectResult.Config.Hostname,
|
|
21
|
+
ports: getPorts(inspectResult),
|
|
22
|
+
healthCheckStatus: getHealthCheckStatus(inspectResult),
|
|
23
|
+
networkSettings: getNetworkSettings(inspectResult),
|
|
24
|
+
state: {
|
|
25
|
+
status: inspectResult.State.Status,
|
|
26
|
+
running: inspectResult.State.Running,
|
|
27
|
+
startedAt: new Date(inspectResult.State.StartedAt),
|
|
28
|
+
finishedAt: finishedAt.getTime() < 0 ? undefined : finishedAt,
|
|
29
|
+
},
|
|
30
|
+
labels: inspectResult.Config.Labels,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
logger_1.log.error(`Failed to inspect container ${container.id}: ${err}`);
|
|
35
|
+
throw err;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
exports.inspectContainer = inspectContainer;
|
|
39
|
+
const getPorts = (inspectInfo) => Object.entries(inspectInfo.NetworkSettings.Ports)
|
|
40
|
+
.filter(([, hostPorts]) => hostPorts !== null)
|
|
41
|
+
.map(([containerPortAndProtocol, hostPorts]) => {
|
|
42
|
+
const containerPort = parseInt(containerPortAndProtocol.split("/")[0]);
|
|
43
|
+
return {
|
|
44
|
+
[containerPort]: hostPorts.map((hostPort) => ({
|
|
45
|
+
hostIp: hostPort.HostIp,
|
|
46
|
+
hostPort: parseInt(hostPort.HostPort),
|
|
47
|
+
})),
|
|
48
|
+
};
|
|
49
|
+
})
|
|
50
|
+
.reduce((acc, curr) => (Object.assign(Object.assign({}, acc), curr)), {});
|
|
51
|
+
const getHealthCheckStatus = (inspectResult) => {
|
|
52
|
+
const health = inspectResult.State.Health;
|
|
53
|
+
if (health === undefined) {
|
|
54
|
+
return "none";
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
return health.Status;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const getNetworkSettings = (inspectResult) => Object.entries(inspectResult.NetworkSettings.Networks)
|
|
61
|
+
.map(([networkName, network]) => ({
|
|
62
|
+
[networkName]: {
|
|
63
|
+
networkId: network.NetworkID,
|
|
64
|
+
ipAddress: network.IPAddress,
|
|
65
|
+
},
|
|
66
|
+
}))
|
|
67
|
+
.reduce((prev, next) => (Object.assign(Object.assign({}, prev), next)), {});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.listContainers = void 0;
|
|
13
|
+
const docker_client_1 = require("../../docker-client");
|
|
14
|
+
const logger_1 = require("../../../logger");
|
|
15
|
+
const listContainers = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
16
|
+
try {
|
|
17
|
+
const { dockerode } = yield (0, docker_client_1.dockerClient)();
|
|
18
|
+
return yield dockerode.listContainers();
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
logger_1.log.error(`Failed to list containers: ${err}`);
|
|
22
|
+
throw err;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
exports.listContainers = listContainers;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Readable } from "stream";
|
|
3
|
+
import Dockerode from "dockerode";
|
|
4
|
+
export type PutContainerArchiveOptions = {
|
|
5
|
+
container: Dockerode.Container;
|
|
6
|
+
stream: Readable;
|
|
7
|
+
containerPath: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const putContainerArchive: (options: PutContainerArchiveOptions) => Promise<void>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.putContainerArchive = void 0;
|
|
13
|
+
const logger_1 = require("../../../logger");
|
|
14
|
+
const putContainerArchive = (options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
+
try {
|
|
16
|
+
yield options.container.putArchive(options.stream, { path: options.containerPath });
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
logger_1.log.error(`Failed to put archive to container ${options.container.id}: ${err}`);
|
|
20
|
+
throw err;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
exports.putContainerArchive = putContainerArchive;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.removeContainer = void 0;
|
|
13
|
+
const logger_1 = require("../../../logger");
|
|
14
|
+
const removeContainer = (container, options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
+
try {
|
|
16
|
+
yield container.remove({ v: options.removeVolumes });
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
logger_1.log.error(`Failed to remove container ${container.id}: ${err}`);
|
|
20
|
+
throw err;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
exports.removeContainer = removeContainer;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.restartContainer = void 0;
|
|
13
|
+
const logger_1 = require("../../../logger");
|
|
14
|
+
const restartContainer = (container, options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
+
try {
|
|
16
|
+
yield container.restart({ t: options.timeout / 1000 });
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
logger_1.log.error(`Failed to restart container ${container.id}: ${err}`);
|
|
20
|
+
throw err;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
exports.restartContainer = restartContainer;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.startContainer = void 0;
|
|
13
|
+
const logger_1 = require("../../../logger");
|
|
14
|
+
const startContainer = (container) => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
+
try {
|
|
16
|
+
yield container.start();
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
logger_1.log.error(`Failed to start container ${container.id}: ${err}`);
|
|
20
|
+
throw err;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
exports.startContainer = startContainer;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.stopContainer = void 0;
|
|
13
|
+
const logger_1 = require("../../../logger");
|
|
14
|
+
const stopContainer = (container, options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
+
try {
|
|
16
|
+
yield container.stop({ t: options.timeout / 1000 });
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
if (err.statusCode === 304) {
|
|
21
|
+
logger_1.log.info(`Container has already been stopped: ${container.id}`);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
logger_1.log.error(`Failed to stop container ${container.id}: ${err}`);
|
|
25
|
+
throw err;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
exports.stopContainer = stopContainer;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createLabels = void 0;
|
|
4
|
+
const session_id_1 = require("../session-id");
|
|
5
|
+
const labels_1 = require("../../labels");
|
|
6
|
+
const package_json_1 = require("../../../package.json");
|
|
7
|
+
const createLabels = (reusable, dockerImageName, extraLabels = {}) => {
|
|
8
|
+
const labels = Object.assign(Object.assign({}, extraLabels), { [labels_1.LABEL_TESTCONTAINERS]: "true", [labels_1.LABEL_TESTCONTAINERS_LANG]: "node", [labels_1.LABEL_TESTCONTAINERS_VERSION]: package_json_1.version });
|
|
9
|
+
if (dockerImageName && dockerImageName.isReaper()) {
|
|
10
|
+
return labels;
|
|
11
|
+
}
|
|
12
|
+
if (!reusable) {
|
|
13
|
+
labels[labels_1.LABEL_TESTCONTAINERS_SESSION_ID] = session_id_1.sessionId;
|
|
14
|
+
}
|
|
15
|
+
return labels;
|
|
16
|
+
};
|
|
17
|
+
exports.createLabels = createLabels;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.demuxStream = void 0;
|
|
13
|
+
const stream_1 = require("stream");
|
|
14
|
+
const logger_1 = require("../../logger");
|
|
15
|
+
const demuxStream = (dockerode, stream) => __awaiter(void 0, void 0, void 0, function* () {
|
|
16
|
+
try {
|
|
17
|
+
const demuxedStream = new stream_1.PassThrough({ autoDestroy: true, encoding: "utf-8" });
|
|
18
|
+
dockerode.modem.demuxStream(stream, demuxedStream, demuxedStream);
|
|
19
|
+
stream.on("end", () => demuxedStream.end());
|
|
20
|
+
demuxedStream.on("close", () => {
|
|
21
|
+
if (!stream.destroyed) {
|
|
22
|
+
stream.destroy();
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
return demuxedStream;
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
logger_1.log.error(`Failed to demux stream: ${err}`);
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
exports.demuxStream = demuxStream;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import Dockerode from "dockerode";
|
|
2
|
+
export type DockerInfo = {
|
|
3
|
+
serverVersion: number;
|
|
4
|
+
operatingSystem: string;
|
|
5
|
+
operatingSystemType: string;
|
|
6
|
+
architecture: string;
|
|
7
|
+
cpus: number;
|
|
8
|
+
memory: number;
|
|
9
|
+
indexServerAddress: string;
|
|
10
|
+
};
|
|
11
|
+
export declare const getDockerInfo: (dockerode: Dockerode) => Promise<DockerInfo>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.getDockerInfo = void 0;
|
|
13
|
+
const logger_1 = require("../../logger");
|
|
14
|
+
const getDockerInfo = (dockerode) => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
+
const info = yield dockerode.info();
|
|
16
|
+
return {
|
|
17
|
+
serverVersion: info.ServerVersion,
|
|
18
|
+
operatingSystem: info.OperatingSystem,
|
|
19
|
+
operatingSystemType: info.OSType,
|
|
20
|
+
architecture: info.Architecture,
|
|
21
|
+
cpus: info.NCPU,
|
|
22
|
+
memory: info.MemTotal,
|
|
23
|
+
indexServerAddress: getIndexServerAddress(info),
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
exports.getDockerInfo = getDockerInfo;
|
|
27
|
+
// https://github.com/containers/podman/issues/17776
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
29
|
+
const getIndexServerAddress = (info) => {
|
|
30
|
+
if (isUndefinedOrEmpty(info.IndexServerAddress)) {
|
|
31
|
+
logger_1.log.debug("Index server address is not set, using default");
|
|
32
|
+
return "https://index.docker.io/v1/";
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
return info.IndexServerAddress;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const isUndefinedOrEmpty = (value) => value === undefined || value.length === 0;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DockerImageName } from "../../../docker-image-name";
|
|
2
|
+
import { PullPolicy } from "../../../pull-policy";
|
|
3
|
+
import { BuildArgs, RegistryConfig } from "../../types";
|
|
4
|
+
export type BuildImageOptions = {
|
|
5
|
+
imageName: DockerImageName;
|
|
6
|
+
context: string;
|
|
7
|
+
dockerfileName: string;
|
|
8
|
+
buildArgs: BuildArgs;
|
|
9
|
+
pullPolicy: PullPolicy;
|
|
10
|
+
registryConfig: RegistryConfig;
|
|
11
|
+
cache: boolean;
|
|
12
|
+
};
|
|
13
|
+
export declare const buildImage: (options: BuildImageOptions) => Promise<void>;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.buildImage = void 0;
|
|
16
|
+
const logger_1 = require("../../../logger");
|
|
17
|
+
const tar_fs_1 = __importDefault(require("tar-fs"));
|
|
18
|
+
const byline_1 = __importDefault(require("byline"));
|
|
19
|
+
const docker_client_1 = require("../../docker-client");
|
|
20
|
+
const create_labels_1 = require("../create-labels");
|
|
21
|
+
const path_1 = __importDefault(require("path"));
|
|
22
|
+
const fs_1 = require("fs");
|
|
23
|
+
const dockerignore_1 = __importDefault(require("@balena/dockerignore"));
|
|
24
|
+
const buildImage = (options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
25
|
+
try {
|
|
26
|
+
logger_1.log.info(`Building image '${options.imageName.toString()}' with context '${options.context}'`);
|
|
27
|
+
const isDockerIgnored = yield createIsDockerIgnoredFunction(options.context);
|
|
28
|
+
const tarStream = tar_fs_1.default.pack(options.context, {
|
|
29
|
+
ignore: (aPath) => {
|
|
30
|
+
const relativePath = path_1.default.relative(options.context, aPath);
|
|
31
|
+
if (relativePath === options.dockerfileName) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
return isDockerIgnored(relativePath);
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
const { dockerode } = yield (0, docker_client_1.dockerClient)();
|
|
40
|
+
const buildImageOptions = {
|
|
41
|
+
dockerfile: options.dockerfileName,
|
|
42
|
+
nocache: !options.cache,
|
|
43
|
+
buildargs: options.buildArgs,
|
|
44
|
+
t: options.imageName.toString(),
|
|
45
|
+
labels: (0, create_labels_1.createLabels)(false, options.imageName),
|
|
46
|
+
registryconfig: options.registryConfig,
|
|
47
|
+
pull: options.pullPolicy.shouldPull() ? "true" : undefined,
|
|
48
|
+
};
|
|
49
|
+
return new Promise((resolve) => {
|
|
50
|
+
dockerode
|
|
51
|
+
.buildImage(tarStream, buildImageOptions)
|
|
52
|
+
.then((stream) => (0, byline_1.default)(stream))
|
|
53
|
+
.then((stream) => {
|
|
54
|
+
stream.setEncoding("utf-8");
|
|
55
|
+
stream.on("data", (line) => logger_1.log.trace(`${options.imageName.toString()}: ${line}`));
|
|
56
|
+
stream.on("end", () => resolve());
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
logger_1.log.error(`Failed to build image: ${err}`);
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
exports.buildImage = buildImage;
|
|
66
|
+
const createIsDockerIgnoredFunction = (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
67
|
+
const dockerIgnoreFilePath = path_1.default.join(context, ".dockerignore");
|
|
68
|
+
if (!(0, fs_1.existsSync)(dockerIgnoreFilePath)) {
|
|
69
|
+
return () => false;
|
|
70
|
+
}
|
|
71
|
+
const instance = (0, dockerignore_1.default)({ ignorecase: false });
|
|
72
|
+
const dockerIgnorePatterns = yield fs_1.promises.readFile(dockerIgnoreFilePath, { encoding: "utf-8" });
|
|
73
|
+
instance.add(dockerIgnorePatterns);
|
|
74
|
+
const filter = instance.createFilter();
|
|
75
|
+
return (aPath) => !filter(aPath);
|
|
76
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.imageExists = void 0;
|
|
16
|
+
const logger_1 = require("../../../logger");
|
|
17
|
+
const async_lock_1 = __importDefault(require("async-lock"));
|
|
18
|
+
const list_images_1 = require("./list-images");
|
|
19
|
+
const existingImages = new Set();
|
|
20
|
+
const imageCheckLock = new async_lock_1.default();
|
|
21
|
+
const imageExists = (dockerode, imageName) => __awaiter(void 0, void 0, void 0, function* () {
|
|
22
|
+
logger_1.log.debug(`Checking if image exists: ${imageName}`);
|
|
23
|
+
return imageCheckLock.acquire(imageName.toString(), () => __awaiter(void 0, void 0, void 0, function* () {
|
|
24
|
+
if (existingImages.has(imageName.toString())) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
const images = yield (0, list_images_1.listImages)(dockerode);
|
|
28
|
+
images.forEach((name) => {
|
|
29
|
+
existingImages.add(name.toString());
|
|
30
|
+
});
|
|
31
|
+
return existingImages.has(imageName.toString());
|
|
32
|
+
}));
|
|
33
|
+
});
|
|
34
|
+
exports.imageExists = imageExists;
|