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,39 @@
|
|
|
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.dockerComposeDown = void 0;
|
|
13
|
+
const logger_1 = require("../../logger");
|
|
14
|
+
const default_docker_compose_options_1 = require("../default-docker-compose-options");
|
|
15
|
+
const docker_compose_1 = require("docker-compose");
|
|
16
|
+
const dockerComposeDown = (options, downOptions) => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
|
+
logger_1.log.info(`Downing DockerCompose environment`);
|
|
18
|
+
try {
|
|
19
|
+
yield (0, docker_compose_1.down)(Object.assign(Object.assign({}, (yield (0, default_docker_compose_options_1.defaultDockerComposeOptions)(options))), { commandOptions: commandOptions(downOptions) }));
|
|
20
|
+
logger_1.log.info(`Downed DockerCompose environment`);
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
const errorMessage = err.err || err.message || err;
|
|
25
|
+
logger_1.log.error(`Failed to down DockerCompose environment: ${errorMessage}`);
|
|
26
|
+
throw new Error(errorMessage);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
exports.dockerComposeDown = dockerComposeDown;
|
|
30
|
+
const commandOptions = (options) => {
|
|
31
|
+
const result = [];
|
|
32
|
+
if (options.removeVolumes) {
|
|
33
|
+
result.push("-v");
|
|
34
|
+
}
|
|
35
|
+
if (options.timeout) {
|
|
36
|
+
result.push("-t", `${options.timeout / 1000}`);
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
@@ -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.dockerComposeStop = void 0;
|
|
13
|
+
const logger_1 = require("../../logger");
|
|
14
|
+
const docker_compose_1 = require("docker-compose");
|
|
15
|
+
const default_docker_compose_options_1 = require("../default-docker-compose-options");
|
|
16
|
+
const dockerComposeStop = (options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
|
+
logger_1.log.info(`Stopping DockerCompose environment`);
|
|
18
|
+
try {
|
|
19
|
+
yield (0, docker_compose_1.stop)(yield (0, default_docker_compose_options_1.defaultDockerComposeOptions)(options));
|
|
20
|
+
logger_1.log.info(`Stopped DockerCompose environment`);
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
const errorMessage = err.err || err.message || err;
|
|
25
|
+
logger_1.log.error(`Failed to stop DockerCompose environment: ${errorMessage}`);
|
|
26
|
+
throw new Error(errorMessage);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
exports.dockerComposeStop = dockerComposeStop;
|
|
@@ -0,0 +1,41 @@
|
|
|
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.dockerComposeUp = void 0;
|
|
13
|
+
const logger_1 = require("../../logger");
|
|
14
|
+
const docker_compose_1 = require("docker-compose");
|
|
15
|
+
const default_docker_compose_options_1 = require("../default-docker-compose-options");
|
|
16
|
+
const docker_compose_down_1 = require("./docker-compose-down");
|
|
17
|
+
const dockerComposeUp = (options, services) => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
|
+
logger_1.log.info(`Upping DockerCompose environment`);
|
|
19
|
+
try {
|
|
20
|
+
if (services) {
|
|
21
|
+
yield (0, docker_compose_1.upMany)(services, yield (0, default_docker_compose_options_1.defaultDockerComposeOptions)(options));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
yield (0, docker_compose_1.upAll)(yield (0, default_docker_compose_options_1.defaultDockerComposeOptions)(options));
|
|
25
|
+
}
|
|
26
|
+
logger_1.log.info(`Upped DockerCompose environment`);
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const errorMessage = err.err || err.message || err;
|
|
31
|
+
logger_1.log.error(`Failed to up DockerCompose environment: ${errorMessage}`);
|
|
32
|
+
try {
|
|
33
|
+
yield (0, docker_compose_down_1.dockerComposeDown)(options, { removeVolumes: true, timeout: 0 });
|
|
34
|
+
}
|
|
35
|
+
catch (_a) {
|
|
36
|
+
logger_1.log.warn(`Failed to down DockerCompose environment after failed up`);
|
|
37
|
+
}
|
|
38
|
+
throw new Error(errorMessage);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
exports.dockerComposeUp = dockerComposeUp;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { WaitStrategy } from "../wait-strategy";
|
|
2
|
+
import { Uuid } from "../uuid";
|
|
3
|
+
import { Environment } from "../docker/types";
|
|
4
|
+
import { StartedDockerComposeEnvironment } from "./started-docker-compose-environment";
|
|
5
|
+
export declare class DockerComposeEnvironment {
|
|
6
|
+
private readonly composeFilePath;
|
|
7
|
+
private readonly composeFiles;
|
|
8
|
+
private projectName;
|
|
9
|
+
private build;
|
|
10
|
+
private recreate;
|
|
11
|
+
private environmentFile;
|
|
12
|
+
private profiles;
|
|
13
|
+
private environment;
|
|
14
|
+
private waitStrategy;
|
|
15
|
+
private startupTimeout;
|
|
16
|
+
constructor(composeFilePath: string, composeFiles: string | string[], uuid?: Uuid);
|
|
17
|
+
withBuild(): this;
|
|
18
|
+
withEnvironment(environment: Environment): this;
|
|
19
|
+
withEnvironmentFile(environmentFile: string): this;
|
|
20
|
+
withProfiles(...profiles: string[]): this;
|
|
21
|
+
withNoRecreate(): this;
|
|
22
|
+
withWaitStrategy(containerName: string, waitStrategy: WaitStrategy): this;
|
|
23
|
+
withStartupTimeout(startupTimeout: number): this;
|
|
24
|
+
up(services?: Array<string>): Promise<StartedDockerComposeEnvironment>;
|
|
25
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
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.DockerComposeEnvironment = void 0;
|
|
13
|
+
const bound_ports_1 = require("../bound-ports");
|
|
14
|
+
const container_name_resolver_1 = require("../docker-compose/functions/container-name-resolver");
|
|
15
|
+
const started_generic_container_1 = require("../generic-container/started-generic-container");
|
|
16
|
+
const logger_1 = require("../logger");
|
|
17
|
+
const wait_strategy_1 = require("../wait-strategy");
|
|
18
|
+
const reaper_1 = require("../reaper");
|
|
19
|
+
const uuid_1 = require("../uuid");
|
|
20
|
+
const list_containers_1 = require("../docker/functions/container/list-containers");
|
|
21
|
+
const get_container_1 = require("../docker/functions/container/get-container");
|
|
22
|
+
const docker_client_1 = require("../docker/docker-client");
|
|
23
|
+
const inspect_container_1 = require("../docker/functions/container/inspect-container");
|
|
24
|
+
const container_logs_1 = require("../docker/functions/container/container-logs");
|
|
25
|
+
const started_docker_compose_environment_1 = require("./started-docker-compose-environment");
|
|
26
|
+
const docker_compose_down_1 = require("../docker-compose/functions/docker-compose-down");
|
|
27
|
+
const docker_compose_up_1 = require("../docker-compose/functions/docker-compose-up");
|
|
28
|
+
const wait_for_container_1 = require("../wait-for-container");
|
|
29
|
+
class DockerComposeEnvironment {
|
|
30
|
+
constructor(composeFilePath, composeFiles, uuid = new uuid_1.RandomUuid()) {
|
|
31
|
+
this.build = false;
|
|
32
|
+
this.recreate = true;
|
|
33
|
+
this.environmentFile = "";
|
|
34
|
+
this.profiles = [];
|
|
35
|
+
this.environment = {};
|
|
36
|
+
this.waitStrategy = {};
|
|
37
|
+
this.startupTimeout = 60000;
|
|
38
|
+
this.composeFilePath = composeFilePath;
|
|
39
|
+
this.composeFiles = composeFiles;
|
|
40
|
+
this.projectName = `testcontainers-${uuid.nextUuid()}`;
|
|
41
|
+
}
|
|
42
|
+
withBuild() {
|
|
43
|
+
this.build = true;
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
withEnvironment(environment) {
|
|
47
|
+
this.environment = Object.assign(Object.assign({}, this.environment), environment);
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
withEnvironmentFile(environmentFile) {
|
|
51
|
+
this.environmentFile = environmentFile;
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
withProfiles(...profiles) {
|
|
55
|
+
this.profiles = [...this.profiles, ...profiles];
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
withNoRecreate() {
|
|
59
|
+
this.recreate = false;
|
|
60
|
+
this.projectName = "testcontainers-node";
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
withWaitStrategy(containerName, waitStrategy) {
|
|
64
|
+
this.waitStrategy[containerName] = waitStrategy;
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
withStartupTimeout(startupTimeout) {
|
|
68
|
+
this.startupTimeout = startupTimeout;
|
|
69
|
+
return this;
|
|
70
|
+
}
|
|
71
|
+
up(services) {
|
|
72
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
+
logger_1.log.info(`Starting DockerCompose environment: ${this.projectName}`);
|
|
74
|
+
(yield reaper_1.ReaperInstance.getInstance()).addProject(this.projectName);
|
|
75
|
+
const options = {
|
|
76
|
+
filePath: this.composeFilePath,
|
|
77
|
+
files: this.composeFiles,
|
|
78
|
+
projectName: this.projectName,
|
|
79
|
+
};
|
|
80
|
+
const commandOptions = [];
|
|
81
|
+
if (this.build) {
|
|
82
|
+
commandOptions.push("--build");
|
|
83
|
+
}
|
|
84
|
+
if (!this.recreate) {
|
|
85
|
+
commandOptions.push("--no-recreate");
|
|
86
|
+
}
|
|
87
|
+
const composeOptions = [];
|
|
88
|
+
if (this.environmentFile) {
|
|
89
|
+
composeOptions.push("--env-file", this.environmentFile);
|
|
90
|
+
}
|
|
91
|
+
this.profiles.forEach((profile) => composeOptions.push("--profile", profile));
|
|
92
|
+
yield (0, docker_compose_up_1.dockerComposeUp)(Object.assign(Object.assign({}, options), { commandOptions, composeOptions, environment: this.environment }), services);
|
|
93
|
+
const startedContainers = (yield (0, list_containers_1.listContainers)()).filter((container) => container.Labels["com.docker.compose.project"] === this.projectName);
|
|
94
|
+
const startedContainerNames = startedContainers.reduce((containerNames, startedContainer) => [
|
|
95
|
+
...containerNames,
|
|
96
|
+
startedContainer.Names.join(", "),
|
|
97
|
+
], []);
|
|
98
|
+
logger_1.log.info(`Started the following containers: ${startedContainerNames.join(", ")}`);
|
|
99
|
+
const startedGenericContainers = (yield Promise.all(startedContainers.map((startedContainer) => __awaiter(this, void 0, void 0, function* () {
|
|
100
|
+
const container = yield (0, get_container_1.getContainerById)(startedContainer.Id);
|
|
101
|
+
const containerName = (0, container_name_resolver_1.resolveContainerName)(this.projectName, startedContainer.Names[0]);
|
|
102
|
+
const { host, hostIps } = yield (0, docker_client_1.dockerClient)();
|
|
103
|
+
const inspectResult = yield (0, inspect_container_1.inspectContainer)(container);
|
|
104
|
+
const boundPorts = bound_ports_1.BoundPorts.fromInspectResult(hostIps, inspectResult);
|
|
105
|
+
const waitStrategy = (this.waitStrategy[containerName] ? this.waitStrategy[containerName] : (0, wait_strategy_1.defaultWaitStrategy)(host, container)).withStartupTimeout(this.startupTimeout);
|
|
106
|
+
(yield (0, container_logs_1.containerLogs)(container))
|
|
107
|
+
.on("data", (data) => logger_1.containerLog.trace(`${containerName}: ${data}`))
|
|
108
|
+
.on("err", (data) => logger_1.containerLog.error(`${containerName}: ${data}`));
|
|
109
|
+
try {
|
|
110
|
+
logger_1.log.info(`Waiting for container ${containerName} to be ready`);
|
|
111
|
+
yield (0, wait_for_container_1.waitForContainer)(container, waitStrategy, host, boundPorts);
|
|
112
|
+
logger_1.log.info(`Container ${containerName} is ready`);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
logger_1.log.error(`Container ${containerName} failed to be ready: ${err}`);
|
|
116
|
+
try {
|
|
117
|
+
yield (0, docker_compose_down_1.dockerComposeDown)(options, { removeVolumes: true, timeout: 0 });
|
|
118
|
+
}
|
|
119
|
+
catch (_a) {
|
|
120
|
+
logger_1.log.warn(`Failed to stop DockerCompose environment after failed up`);
|
|
121
|
+
}
|
|
122
|
+
throw err;
|
|
123
|
+
}
|
|
124
|
+
return new started_generic_container_1.StartedGenericContainer(container, host, inspectResult, boundPorts, containerName, waitStrategy);
|
|
125
|
+
})))).reduce((map, startedGenericContainer) => {
|
|
126
|
+
const containerName = startedGenericContainer.getName();
|
|
127
|
+
return Object.assign(Object.assign({}, map), { [containerName]: startedGenericContainer });
|
|
128
|
+
}, {});
|
|
129
|
+
logger_1.log.info(`DockerCompose environment started: ${Object.keys(startedGenericContainers).join(", ")}`);
|
|
130
|
+
return new started_docker_compose_environment_1.StartedDockerComposeEnvironment(startedGenericContainers, Object.assign(Object.assign({}, options), { composeOptions, environment: this.environment }));
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
exports.DockerComposeEnvironment = DockerComposeEnvironment;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { StartedGenericContainer } from "../generic-container/started-generic-container";
|
|
2
|
+
import { StoppedDockerComposeEnvironment } from "./stopped-docker-compose-environment";
|
|
3
|
+
import { DownedDockerComposeEnvironment } from "./downed-docker-compose-environment";
|
|
4
|
+
import { DockerComposeOptions } from "../docker-compose/docker-compose-options";
|
|
5
|
+
import { DockerComposeDownOptions } from "../test-container";
|
|
6
|
+
export declare class StartedDockerComposeEnvironment {
|
|
7
|
+
private readonly startedGenericContainers;
|
|
8
|
+
private readonly options;
|
|
9
|
+
constructor(startedGenericContainers: {
|
|
10
|
+
[containerName: string]: StartedGenericContainer;
|
|
11
|
+
}, options: DockerComposeOptions);
|
|
12
|
+
stop(): Promise<StoppedDockerComposeEnvironment>;
|
|
13
|
+
down(options?: Partial<DockerComposeDownOptions>): Promise<DownedDockerComposeEnvironment>;
|
|
14
|
+
getContainer(containerName: string): StartedGenericContainer;
|
|
15
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
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.StartedDockerComposeEnvironment = void 0;
|
|
13
|
+
const logger_1 = require("../logger");
|
|
14
|
+
const docker_compose_down_1 = require("../docker-compose/functions/docker-compose-down");
|
|
15
|
+
const docker_compose_stop_1 = require("../docker-compose/functions/docker-compose-stop");
|
|
16
|
+
const stopped_docker_compose_environment_1 = require("./stopped-docker-compose-environment");
|
|
17
|
+
const downed_docker_compose_environment_1 = require("./downed-docker-compose-environment");
|
|
18
|
+
class StartedDockerComposeEnvironment {
|
|
19
|
+
constructor(startedGenericContainers, options) {
|
|
20
|
+
this.startedGenericContainers = startedGenericContainers;
|
|
21
|
+
this.options = options;
|
|
22
|
+
}
|
|
23
|
+
stop() {
|
|
24
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
25
|
+
yield (0, docker_compose_stop_1.dockerComposeStop)(this.options);
|
|
26
|
+
return new stopped_docker_compose_environment_1.StoppedDockerComposeEnvironment(this.options);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
down(options = {}) {
|
|
30
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
+
const downOptions = Object.assign({ timeout: 0, removeVolumes: true }, options);
|
|
32
|
+
yield (0, docker_compose_down_1.dockerComposeDown)(this.options, downOptions);
|
|
33
|
+
return new downed_docker_compose_environment_1.DownedDockerComposeEnvironment();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
getContainer(containerName) {
|
|
37
|
+
const container = this.startedGenericContainers[containerName];
|
|
38
|
+
if (!container) {
|
|
39
|
+
const error = `Cannot get container "${containerName}" as it is not running`;
|
|
40
|
+
logger_1.log.error(error);
|
|
41
|
+
throw new Error(error);
|
|
42
|
+
}
|
|
43
|
+
return container;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.StartedDockerComposeEnvironment = StartedDockerComposeEnvironment;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DownedDockerComposeEnvironment } from "./downed-docker-compose-environment";
|
|
2
|
+
import { DockerComposeOptions } from "../docker-compose/docker-compose-options";
|
|
3
|
+
import { DockerComposeDownOptions } from "../test-container";
|
|
4
|
+
export declare class StoppedDockerComposeEnvironment {
|
|
5
|
+
private readonly options;
|
|
6
|
+
constructor(options: DockerComposeOptions);
|
|
7
|
+
down(options?: Partial<DockerComposeDownOptions>): Promise<DownedDockerComposeEnvironment>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
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.StoppedDockerComposeEnvironment = void 0;
|
|
13
|
+
const docker_compose_down_1 = require("../docker-compose/functions/docker-compose-down");
|
|
14
|
+
const downed_docker_compose_environment_1 = require("./downed-docker-compose-environment");
|
|
15
|
+
class StoppedDockerComposeEnvironment {
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.options = options;
|
|
18
|
+
}
|
|
19
|
+
down(options = {}) {
|
|
20
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
+
const resolvedOptions = Object.assign({ timeout: 0, removeVolumes: true }, options);
|
|
22
|
+
yield (0, docker_compose_down_1.dockerComposeDown)(this.options, resolvedOptions);
|
|
23
|
+
return new downed_docker_compose_environment_1.DownedDockerComposeEnvironment();
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.StoppedDockerComposeEnvironment = StoppedDockerComposeEnvironment;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class DockerImageName {
|
|
2
|
+
readonly registry: string | undefined;
|
|
3
|
+
readonly image: string;
|
|
4
|
+
readonly tag: string;
|
|
5
|
+
private readonly string;
|
|
6
|
+
private static readonly HELPER_CONTAINERS;
|
|
7
|
+
constructor(registry: string | undefined, image: string, tag: string);
|
|
8
|
+
equals(other: DockerImageName): boolean;
|
|
9
|
+
toString(): string;
|
|
10
|
+
isReaper(): boolean;
|
|
11
|
+
isHelperContainer(): boolean;
|
|
12
|
+
static fromString(string: string): DockerImageName;
|
|
13
|
+
private static getRegistry;
|
|
14
|
+
private static isRegistry;
|
|
15
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DockerImageName = void 0;
|
|
4
|
+
const images_1 = require("./images");
|
|
5
|
+
class DockerImageName {
|
|
6
|
+
constructor(registry, image, tag) {
|
|
7
|
+
this.registry = registry;
|
|
8
|
+
this.image = image;
|
|
9
|
+
this.tag = tag;
|
|
10
|
+
if (this.registry) {
|
|
11
|
+
if (this.tag.startsWith("sha256:")) {
|
|
12
|
+
this.string = `${this.registry}/${this.image}@${this.tag}`;
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
this.string = `${this.registry}/${this.image}:${this.tag}`;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
else if (this.tag.startsWith("sha256:")) {
|
|
19
|
+
this.string = `${this.image}@${this.tag}`;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
this.string = `${this.image}:${this.tag}`;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
equals(other) {
|
|
26
|
+
return this.registry === other.registry && this.image === other.image && this.tag === other.tag;
|
|
27
|
+
}
|
|
28
|
+
toString() {
|
|
29
|
+
return this.string;
|
|
30
|
+
}
|
|
31
|
+
isReaper() {
|
|
32
|
+
return this.string === images_1.REAPER_IMAGE;
|
|
33
|
+
}
|
|
34
|
+
isHelperContainer() {
|
|
35
|
+
return DockerImageName.HELPER_CONTAINERS.has(this.string);
|
|
36
|
+
}
|
|
37
|
+
static fromString(string) {
|
|
38
|
+
const registry = this.getRegistry(string);
|
|
39
|
+
const stringWithoutRegistry = registry ? string.split("/").slice(1).join("/") : string;
|
|
40
|
+
if (stringWithoutRegistry.includes("@")) {
|
|
41
|
+
const [image, tag] = stringWithoutRegistry.split("@");
|
|
42
|
+
return new DockerImageName(registry, image, tag);
|
|
43
|
+
}
|
|
44
|
+
else if (stringWithoutRegistry.includes(":")) {
|
|
45
|
+
const [image, tag] = stringWithoutRegistry.split(":");
|
|
46
|
+
return new DockerImageName(registry, image, tag);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
return new DockerImageName(registry, stringWithoutRegistry, "latest");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
static getRegistry(string) {
|
|
53
|
+
const parts = string.split("/");
|
|
54
|
+
if (parts.length > 1 && this.isRegistry(parts[0])) {
|
|
55
|
+
return parts[0];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
static isRegistry(string) {
|
|
59
|
+
return string.includes(".") || string.includes(":") || string === "localhost";
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.DockerImageName = DockerImageName;
|
|
63
|
+
DockerImageName.HELPER_CONTAINERS = new Set([images_1.REAPER_IMAGE, images_1.SSHD_IMAGE]);
|
|
@@ -0,0 +1,39 @@
|
|
|
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.getDockerfileImages = void 0;
|
|
13
|
+
const os_1 = require("os");
|
|
14
|
+
const fs_1 = require("fs");
|
|
15
|
+
const logger_1 = require("./logger");
|
|
16
|
+
const docker_image_name_1 = require("./docker-image-name");
|
|
17
|
+
const buildArgRegex = /\${([^{]+)}/g;
|
|
18
|
+
const getDockerfileImages = (dockerfile, buildArgs) => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
|
+
try {
|
|
20
|
+
return (yield parseImages(dockerfile))
|
|
21
|
+
.map((line) => line.replace(buildArgRegex, (_, arg) => { var _a; return (_a = buildArgs[arg]) !== null && _a !== void 0 ? _a : ""; }))
|
|
22
|
+
.map((line) => docker_image_name_1.DockerImageName.fromString(line));
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
logger_1.log.error(`Failed to read Dockerfile "${dockerfile}": ${err}`);
|
|
26
|
+
throw err;
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
exports.getDockerfileImages = getDockerfileImages;
|
|
30
|
+
function parseImages(dockerfile) {
|
|
31
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
return Array.from((yield fs_1.promises.readFile(dockerfile, "utf8"))
|
|
33
|
+
.split(os_1.EOL)
|
|
34
|
+
.filter((line) => line.toUpperCase().startsWith("FROM"))
|
|
35
|
+
.map((line) => line.split(" ").filter((part) => part !== "")[1])
|
|
36
|
+
.reduce((prev, next) => prev.add(next), new Set())
|
|
37
|
+
.values());
|
|
38
|
+
});
|
|
39
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BuildArgs } from "../docker/types";
|
|
2
|
+
import { PullPolicy } from "../pull-policy";
|
|
3
|
+
import { Uuid } from "../uuid";
|
|
4
|
+
import { GenericContainer } from "./generic-container";
|
|
5
|
+
export declare class GenericContainerBuilder {
|
|
6
|
+
private readonly context;
|
|
7
|
+
private readonly dockerfileName;
|
|
8
|
+
private readonly uuid;
|
|
9
|
+
private buildArgs;
|
|
10
|
+
private pullPolicy;
|
|
11
|
+
private cache;
|
|
12
|
+
constructor(context: string, dockerfileName: string, uuid?: Uuid);
|
|
13
|
+
withBuildArgs(buildArgs: BuildArgs): GenericContainerBuilder;
|
|
14
|
+
withPullPolicy(pullPolicy: PullPolicy): this;
|
|
15
|
+
withCache(cache: boolean): this;
|
|
16
|
+
build(image?: string): Promise<GenericContainer>;
|
|
17
|
+
private getRegistryConfig;
|
|
18
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
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.GenericContainerBuilder = void 0;
|
|
16
|
+
const pull_policy_1 = require("../pull-policy");
|
|
17
|
+
const uuid_1 = require("../uuid");
|
|
18
|
+
const reaper_1 = require("../reaper");
|
|
19
|
+
const docker_image_name_1 = require("../docker-image-name");
|
|
20
|
+
const path_1 = __importDefault(require("path"));
|
|
21
|
+
const logger_1 = require("../logger");
|
|
22
|
+
const dockerfile_parser_1 = require("../dockerfile-parser");
|
|
23
|
+
const build_image_1 = require("../docker/functions/image/build-image");
|
|
24
|
+
const get_auth_config_1 = require("../registry-auth-locator/get-auth-config");
|
|
25
|
+
const generic_container_1 = require("./generic-container");
|
|
26
|
+
const docker_client_1 = require("../docker/docker-client");
|
|
27
|
+
const image_exists_1 = require("../docker/functions/image/image-exists");
|
|
28
|
+
class GenericContainerBuilder {
|
|
29
|
+
constructor(context, dockerfileName, uuid = new uuid_1.RandomUuid()) {
|
|
30
|
+
this.context = context;
|
|
31
|
+
this.dockerfileName = dockerfileName;
|
|
32
|
+
this.uuid = uuid;
|
|
33
|
+
this.buildArgs = {};
|
|
34
|
+
this.pullPolicy = new pull_policy_1.DefaultPullPolicy();
|
|
35
|
+
this.cache = true;
|
|
36
|
+
}
|
|
37
|
+
withBuildArgs(buildArgs) {
|
|
38
|
+
this.buildArgs = buildArgs;
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
withPullPolicy(pullPolicy) {
|
|
42
|
+
this.pullPolicy = pullPolicy;
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
withCache(cache) {
|
|
46
|
+
this.cache = cache;
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
// https://github.com/containers/buildah/issues/1034
|
|
50
|
+
build(image = `localhost/${this.uuid.nextUuid()}:${this.uuid.nextUuid()}`) {
|
|
51
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
const imageName = docker_image_name_1.DockerImageName.fromString(image);
|
|
53
|
+
yield reaper_1.ReaperInstance.getInstance();
|
|
54
|
+
const dockerfile = path_1.default.resolve(this.context, this.dockerfileName);
|
|
55
|
+
logger_1.log.debug(`Preparing to build Dockerfile: ${dockerfile}`);
|
|
56
|
+
const imageNames = yield (0, dockerfile_parser_1.getDockerfileImages)(dockerfile, this.buildArgs);
|
|
57
|
+
const { dockerode, indexServerAddress } = yield (0, docker_client_1.dockerClient)();
|
|
58
|
+
const registryConfig = yield this.getRegistryConfig(indexServerAddress, imageNames);
|
|
59
|
+
yield (0, build_image_1.buildImage)({
|
|
60
|
+
imageName: imageName,
|
|
61
|
+
context: this.context,
|
|
62
|
+
dockerfileName: this.dockerfileName,
|
|
63
|
+
buildArgs: this.buildArgs,
|
|
64
|
+
pullPolicy: this.pullPolicy,
|
|
65
|
+
cache: this.cache,
|
|
66
|
+
registryConfig,
|
|
67
|
+
});
|
|
68
|
+
const container = new generic_container_1.GenericContainer(imageName.toString());
|
|
69
|
+
if (!(yield (0, image_exists_1.imageExists)(dockerode, imageName))) {
|
|
70
|
+
throw new Error("Failed to build image");
|
|
71
|
+
}
|
|
72
|
+
return Promise.resolve(container);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
getRegistryConfig(indexServerAddress, imageNames) {
|
|
76
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
77
|
+
const authConfigs = [];
|
|
78
|
+
yield Promise.all(imageNames.map((imageName) => __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
var _a;
|
|
80
|
+
const authConfig = yield (0, get_auth_config_1.getAuthConfig)((_a = imageName.registry) !== null && _a !== void 0 ? _a : indexServerAddress);
|
|
81
|
+
if (authConfig !== undefined) {
|
|
82
|
+
authConfigs.push(authConfig);
|
|
83
|
+
}
|
|
84
|
+
})));
|
|
85
|
+
return authConfigs
|
|
86
|
+
.map((authConfig) => {
|
|
87
|
+
return {
|
|
88
|
+
[authConfig.registryAddress]: {
|
|
89
|
+
username: authConfig.username,
|
|
90
|
+
password: authConfig.password,
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
})
|
|
94
|
+
.reduce((prev, next) => (Object.assign(Object.assign({}, prev), next)), {});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.GenericContainerBuilder = GenericContainerBuilder;
|