testcontainers 8.6.2-beta.0 → 8.7.2
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/README.md +13 -0
- package/dist/bound-ports.js +1 -1
- package/dist/docker/docker-client.js +3 -3
- package/dist/docker/functions/container/attach-container.js +1 -1
- package/dist/docker/functions/container/container-logs.js +1 -1
- package/dist/docker/functions/container/create-container.d.ts +1 -2
- package/dist/docker/functions/container/create-container.js +3 -3
- package/dist/docker/functions/container/get-container.js +1 -1
- package/dist/docker/functions/container/inspect-container.d.ts +2 -1
- package/dist/docker/functions/container/inspect-container.js +1 -0
- package/dist/docker/functions/create-labels.d.ts +1 -3
- package/dist/docker/functions/image/build-image.js +4 -4
- package/dist/docker/functions/image/image-exists.js +1 -1
- package/dist/docker/functions/image/pull-image.js +1 -1
- package/dist/docker/functions/network/create-network.js +1 -1
- package/dist/docker/functions/run-in-container.js +4 -4
- package/dist/docker/pull-stream-parser.js +1 -1
- package/dist/docker/types.d.ts +3 -0
- package/dist/docker-compose/functions/docker-compose-down.js +1 -1
- package/dist/docker-compose/functions/docker-compose-stop.js +1 -1
- package/dist/docker-compose/functions/docker-compose-up.js +3 -3
- package/dist/docker-compose-environment/docker-compose-environment.js +7 -7
- package/dist/docker-compose-environment/started-docker-compose-environment.js +2 -2
- package/dist/docker-compose-environment/stopped-docker-compose-environment.js +1 -1
- package/dist/generic-container/generic-container-builder.js +4 -4
- package/dist/generic-container/generic-container.d.ts +3 -1
- package/dist/generic-container/generic-container.js +21 -15
- package/dist/generic-container/started-generic-container.d.ts +2 -1
- package/dist/generic-container/started-generic-container.js +7 -4
- package/dist/log-system-diagnostics.js +2 -2
- package/dist/logger.js +1 -1
- package/dist/modules/abstract-started-container.d.ts +2 -1
- package/dist/modules/abstract-started-container.js +3 -0
- package/dist/modules/kafka/kafka-container.d.ts +0 -1
- package/dist/modules/kafka/kafka-container.js +2 -3
- package/dist/network.js +2 -2
- package/dist/port-check.js +1 -1
- package/dist/port-forwarder.js +1 -1
- package/dist/port-generator.js +1 -1
- package/dist/reaper.js +2 -3
- package/dist/registry-auth-locator/credential-provider.js +2 -2
- package/dist/registry-auth-locator/index.js +1 -1
- package/dist/test-container.d.ts +2 -1
- package/dist/testcontainers-properties-file.js +4 -4
- package/dist/wait-strategy.js +3 -3
- package/package.json +21 -21
package/README.md
CHANGED
|
@@ -243,6 +243,19 @@ const container = await new GenericContainer("alpine")
|
|
|
243
243
|
.start();
|
|
244
244
|
```
|
|
245
245
|
|
|
246
|
+
Creating a container with labels:
|
|
247
|
+
|
|
248
|
+
```javascript
|
|
249
|
+
const { GenericContainer } = require("testcontainers");
|
|
250
|
+
|
|
251
|
+
const container = await new GenericContainer("alpine")
|
|
252
|
+
.withLabels({
|
|
253
|
+
label1: "value1",
|
|
254
|
+
label2: "value2",
|
|
255
|
+
})
|
|
256
|
+
.start();
|
|
257
|
+
```
|
|
258
|
+
|
|
246
259
|
Creating a container with a custom health check command. Note that `interval`, `timeout`, `retries` and `startPeriod` are optional; the values will be inherited from the image or parent image if omitted. Also note that the wait strategy should be set to `Wait.forHealthCheck()` for this option to take effect:
|
|
247
260
|
|
|
248
261
|
```javascript
|
package/dist/bound-ports.js
CHANGED
|
@@ -21,7 +21,7 @@ class BoundPorts {
|
|
|
21
21
|
}
|
|
22
22
|
filter(ports) {
|
|
23
23
|
const boundPorts = new BoundPorts();
|
|
24
|
-
const containerPorts = ports.map((port) => port_1.getContainerPort(port));
|
|
24
|
+
const containerPorts = ports.map((port) => (0, port_1.getContainerPort)(port));
|
|
25
25
|
for (const [internalPort, hostPort] of this.iterator()) {
|
|
26
26
|
if (containerPorts.includes(internalPort)) {
|
|
27
27
|
boundPorts.setBinding(internalPort, hostPort);
|
|
@@ -35,7 +35,7 @@ const getDockerClient = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
35
35
|
if (yield isDockerDaemonReachable(dockerode)) {
|
|
36
36
|
const host = yield resolveHost(dockerode, uri);
|
|
37
37
|
logger_1.log.info(`Using Docker client strategy: ${strategy.getName()}, Docker host: ${host}`);
|
|
38
|
-
log_system_diagnostics_1.logSystemDiagnostics();
|
|
38
|
+
(0, log_system_diagnostics_1.logSystemDiagnostics)();
|
|
39
39
|
return { host, dockerode };
|
|
40
40
|
}
|
|
41
41
|
else {
|
|
@@ -148,6 +148,6 @@ const findGateway = (dockerode) => __awaiter(void 0, void 0, void 0, function* (
|
|
|
148
148
|
const inspectResult = yield dockerode.getNetwork("bridge").inspect();
|
|
149
149
|
return (_c = (_b = (_a = inspectResult === null || inspectResult === void 0 ? void 0 : inspectResult.IPAM) === null || _a === void 0 ? void 0 : _a.Config) === null || _b === void 0 ? void 0 : _b.find((config) => config.Gateway !== undefined)) === null || _c === void 0 ? void 0 : _c.Gateway;
|
|
150
150
|
});
|
|
151
|
-
const findDefaultGateway = (dockerode) => __awaiter(void 0, void 0, void 0, function* () { return run_in_container_1.runInContainer(dockerode, "alpine:3.
|
|
152
|
-
const isInContainer = () => fs_1.existsSync("/.dockerenv");
|
|
151
|
+
const findDefaultGateway = (dockerode) => __awaiter(void 0, void 0, void 0, function* () { return (0, run_in_container_1.runInContainer)(dockerode, "alpine:3.14", ["sh", "-c", "ip route|awk '/default/ { print $3 }'"]); });
|
|
152
|
+
const isInContainer = () => (0, fs_1.existsSync)("/.dockerenv");
|
|
153
153
|
exports.dockerClient = getDockerClient();
|
|
@@ -15,7 +15,7 @@ const logger_1 = require("../../../logger");
|
|
|
15
15
|
const attachContainer = (container) => __awaiter(void 0, void 0, void 0, function* () {
|
|
16
16
|
try {
|
|
17
17
|
const stream = (yield container.attach({ stream: true, stdout: true, stderr: true }));
|
|
18
|
-
return demux_stream_1.demuxStream(stream);
|
|
18
|
+
return (0, demux_stream_1.demuxStream)(stream);
|
|
19
19
|
}
|
|
20
20
|
catch (err) {
|
|
21
21
|
logger_1.log.error(`Failed to attach to container ${container.id}: ${err}`);
|
|
@@ -21,7 +21,7 @@ const containerLogs = (container) => __awaiter(void 0, void 0, void 0, function*
|
|
|
21
21
|
};
|
|
22
22
|
const stream = (yield container.logs(options));
|
|
23
23
|
stream.socket.unref();
|
|
24
|
-
return demux_stream_1.demuxStream(stream);
|
|
24
|
+
return (0, demux_stream_1.demuxStream)(stream);
|
|
25
25
|
}
|
|
26
26
|
catch (err) {
|
|
27
27
|
logger_1.log.error(`Failed to get container logs: ${err}`);
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { DockerImageName } from "../../../docker-image-name";
|
|
2
2
|
import Dockerode from "dockerode";
|
|
3
3
|
import { PortWithOptionalBinding } from "../../../port";
|
|
4
|
-
import { Labels } from "
|
|
5
|
-
import { BindMount, Command, ContainerName, Env, ExtraHost, HealthCheck, NetworkMode, TmpFs } from "../../types";
|
|
4
|
+
import { BindMount, Command, ContainerName, Env, ExtraHost, HealthCheck, Labels, NetworkMode, TmpFs } from "../../types";
|
|
6
5
|
export declare type CreateContainerOptions = {
|
|
7
6
|
imageName: DockerImageName;
|
|
8
7
|
env: Env;
|
|
@@ -25,7 +25,7 @@ const createContainer = (options) => __awaiter(void 0, void 0, void 0, function*
|
|
|
25
25
|
Env: getEnv(options.env),
|
|
26
26
|
ExposedPorts: getExposedPorts(options.exposedPorts),
|
|
27
27
|
Cmd: options.cmd,
|
|
28
|
-
Labels: create_labels_1.createLabels(options.reusable, options.imageName, options.labels),
|
|
28
|
+
Labels: (0, create_labels_1.createLabels)(options.reusable, options.imageName, options.labels),
|
|
29
29
|
// @ts-ignore
|
|
30
30
|
Healthcheck: getHealthCheck(options.healthCheck),
|
|
31
31
|
HostConfig: {
|
|
@@ -51,7 +51,7 @@ const getEnv = (env) => Object.entries(env).reduce((dockerodeEnvironment, [key,
|
|
|
51
51
|
const getExposedPorts = (exposedPorts) => {
|
|
52
52
|
const dockerodeExposedPorts = {};
|
|
53
53
|
for (const exposedPort of exposedPorts) {
|
|
54
|
-
dockerodeExposedPorts[port_1.getContainerPort(exposedPort).toString()] = {};
|
|
54
|
+
dockerodeExposedPorts[(0, port_1.getContainerPort)(exposedPort).toString()] = {};
|
|
55
55
|
}
|
|
56
56
|
return dockerodeExposedPorts;
|
|
57
57
|
};
|
|
@@ -61,7 +61,7 @@ const getExtraHosts = (extraHosts) => {
|
|
|
61
61
|
const getPortBindings = (exposedPorts) => {
|
|
62
62
|
const dockerodePortBindings = {};
|
|
63
63
|
for (const exposedPort of exposedPorts) {
|
|
64
|
-
if (port_1.hasHostBinding(exposedPort)) {
|
|
64
|
+
if ((0, port_1.hasHostBinding)(exposedPort)) {
|
|
65
65
|
dockerodePortBindings[exposedPort.container] = [{ HostPort: exposedPort.host.toString() }];
|
|
66
66
|
}
|
|
67
67
|
else {
|
|
@@ -38,7 +38,7 @@ const getContainerByHash = (hash) => __awaiter(void 0, void 0, void 0, function*
|
|
|
38
38
|
return undefined;
|
|
39
39
|
}
|
|
40
40
|
else {
|
|
41
|
-
return yield exports.getContainerById(containers[0].Id);
|
|
41
|
+
return yield (0, exports.getContainerById)(containers[0].Id);
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
catch (err) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ContainerName, HealthCheckStatus, NetworkSettings, Ports } from "../../types";
|
|
1
|
+
import { ContainerName, HealthCheckStatus, Labels, NetworkSettings, Ports } from "../../types";
|
|
2
2
|
import Dockerode from "dockerode";
|
|
3
3
|
export declare type InspectResult = {
|
|
4
4
|
name: ContainerName;
|
|
@@ -12,5 +12,6 @@ export declare type InspectResult = {
|
|
|
12
12
|
status: string;
|
|
13
13
|
running: boolean;
|
|
14
14
|
};
|
|
15
|
+
labels: Labels;
|
|
15
16
|
};
|
|
16
17
|
export declare const inspectContainer: (container: Dockerode.Container) => Promise<InspectResult>;
|
|
@@ -21,6 +21,7 @@ const inspectContainer = (container) => __awaiter(void 0, void 0, void 0, functi
|
|
|
21
21
|
healthCheckStatus: getHealthCheckStatus(inspectResult),
|
|
22
22
|
networkSettings: getNetworkSettings(inspectResult),
|
|
23
23
|
state: { status: inspectResult.State.Status, running: inspectResult.State.Running },
|
|
24
|
+
labels: inspectResult.Config.Labels,
|
|
24
25
|
};
|
|
25
26
|
}
|
|
26
27
|
catch (err) {
|
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import { DockerImageName } from "../../docker-image-name";
|
|
2
|
-
|
|
3
|
-
[key: string]: string;
|
|
4
|
-
};
|
|
2
|
+
import { Labels } from "../types";
|
|
5
3
|
export declare const createLabels: (reusable: boolean, dockerImageName?: DockerImageName | undefined, extraLabels?: Labels) => Labels;
|
|
@@ -42,11 +42,11 @@ const buildImage = (options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
42
42
|
dockerfile: options.dockerfileName,
|
|
43
43
|
buildargs: options.buildArgs,
|
|
44
44
|
t: options.imageName.toString(),
|
|
45
|
-
labels: create_labels_1.createLabels(false, options.imageName),
|
|
45
|
+
labels: (0, create_labels_1.createLabels)(false, options.imageName),
|
|
46
46
|
registryconfig: options.registryConfig,
|
|
47
47
|
pull: options.pullPolicy.shouldPull() ? "any" : undefined,
|
|
48
48
|
})
|
|
49
|
-
.then((stream) => byline_1.default(stream))
|
|
49
|
+
.then((stream) => (0, byline_1.default)(stream))
|
|
50
50
|
.then((stream) => {
|
|
51
51
|
stream.setEncoding("utf-8");
|
|
52
52
|
stream.on("data", (line) => logger_1.log.trace(`${options.imageName.toString()}: ${line}`));
|
|
@@ -61,10 +61,10 @@ const buildImage = (options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
61
61
|
exports.buildImage = buildImage;
|
|
62
62
|
const createIsDockerIgnoredFunction = (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
63
63
|
const dockerIgnoreFilePath = path_1.default.join(context, ".dockerignore");
|
|
64
|
-
if (!fs_1.existsSync(dockerIgnoreFilePath)) {
|
|
64
|
+
if (!(0, fs_1.existsSync)(dockerIgnoreFilePath)) {
|
|
65
65
|
return () => false;
|
|
66
66
|
}
|
|
67
|
-
const instance = dockerignore_1.default({ ignorecase: false });
|
|
67
|
+
const instance = (0, dockerignore_1.default)({ ignorecase: false });
|
|
68
68
|
const dockerIgnorePatterns = yield fs_1.promises.readFile(dockerIgnoreFilePath, { encoding: "utf-8" });
|
|
69
69
|
instance.add(dockerIgnorePatterns);
|
|
70
70
|
const filter = instance.createFilter();
|
|
@@ -12,6 +12,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.imageExists = void 0;
|
|
13
13
|
const list_images_1 = require("./list-images");
|
|
14
14
|
const imageExists = (imageName) => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
-
return (yield list_images_1.listImages()).some((image) => image.equals(imageName));
|
|
15
|
+
return (yield (0, list_images_1.listImages)()).some((image) => image.equals(imageName));
|
|
16
16
|
});
|
|
17
17
|
exports.imageExists = imageExists;
|
|
@@ -16,7 +16,7 @@ const docker_client_1 = require("../../docker-client");
|
|
|
16
16
|
const image_exists_1 = require("./image-exists");
|
|
17
17
|
const pullImage = (options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
18
|
try {
|
|
19
|
-
if ((yield image_exists_1.imageExists(options.imageName)) && !options.force) {
|
|
19
|
+
if ((yield (0, image_exists_1.imageExists)(options.imageName)) && !options.force) {
|
|
20
20
|
logger_1.log.debug(`Not pulling image as it already exists: ${options.imageName}`);
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
@@ -26,7 +26,7 @@ const createNetwork = (options) => __awaiter(void 0, void 0, void 0, function* (
|
|
|
26
26
|
Ingress: options.ingress,
|
|
27
27
|
EnableIPv6: options.enableIPv6,
|
|
28
28
|
Options: options.options,
|
|
29
|
-
Labels: Object.assign(Object.assign({}, options.labels), create_labels_1.createLabels(false)),
|
|
29
|
+
Labels: Object.assign(Object.assign({}, options.labels), (0, create_labels_1.createLabels)(false)),
|
|
30
30
|
});
|
|
31
31
|
return network.id;
|
|
32
32
|
}
|
|
@@ -19,14 +19,14 @@ const inspect_container_1 = require("./container/inspect-container");
|
|
|
19
19
|
const runInContainer = (dockerode, image, command) => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
20
|
try {
|
|
21
21
|
const imageName = docker_image_name_1.DockerImageName.fromString(image);
|
|
22
|
-
yield pull_image_1.pullImage({ imageName, force: false });
|
|
22
|
+
yield (0, pull_image_1.pullImage)({ imageName, force: false });
|
|
23
23
|
logger_1.log.debug(`Creating container: ${image} with command: ${command.join(" ")}`);
|
|
24
24
|
const container = yield dockerode.createContainer({ Image: image, Cmd: command, HostConfig: { AutoRemove: true } });
|
|
25
25
|
logger_1.log.debug(`Attaching to container: ${container.id}`);
|
|
26
|
-
const stream = yield attach_container_1.attachContainer(container);
|
|
26
|
+
const stream = yield (0, attach_container_1.attachContainer)(container);
|
|
27
27
|
const promise = new Promise((resolve) => {
|
|
28
28
|
const interval = setInterval(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
29
|
-
const inspect = yield inspect_container_1.inspectContainer(container);
|
|
29
|
+
const inspect = yield (0, inspect_container_1.inspectContainer)(container);
|
|
30
30
|
if (inspect.state.status === "exited") {
|
|
31
31
|
clearInterval(interval);
|
|
32
32
|
stream.destroy();
|
|
@@ -40,7 +40,7 @@ const runInContainer = (dockerode, image, command) => __awaiter(void 0, void 0,
|
|
|
40
40
|
});
|
|
41
41
|
});
|
|
42
42
|
logger_1.log.debug(`Starting container: ${container.id}`);
|
|
43
|
-
yield start_container_1.startContainer(container);
|
|
43
|
+
yield (0, start_container_1.startContainer)(container);
|
|
44
44
|
logger_1.log.debug(`Waiting for container output: ${container.id}`);
|
|
45
45
|
const output = yield promise;
|
|
46
46
|
if (output.length === 0) {
|
|
@@ -14,7 +14,7 @@ class PullStreamParser {
|
|
|
14
14
|
const messagesById = new Map();
|
|
15
15
|
const statusesById = new Map();
|
|
16
16
|
return new Promise((resolve) => {
|
|
17
|
-
byline_1.default(stream).on("data", (line) => {
|
|
17
|
+
(0, byline_1.default)(stream).on("data", (line) => {
|
|
18
18
|
try {
|
|
19
19
|
const json = JSON.parse(line);
|
|
20
20
|
const { id, status } = json;
|
package/dist/docker/types.d.ts
CHANGED
|
@@ -28,6 +28,9 @@ export declare type ExtraHost = {
|
|
|
28
28
|
};
|
|
29
29
|
export declare type NetworkMode = string;
|
|
30
30
|
export declare type ContainerName = string;
|
|
31
|
+
export declare type Labels = {
|
|
32
|
+
[key: string]: string;
|
|
33
|
+
};
|
|
31
34
|
export declare type Ports = {
|
|
32
35
|
[internalPort: number]: number;
|
|
33
36
|
};
|
|
@@ -16,7 +16,7 @@ const docker_compose_1 = require("../docker-compose");
|
|
|
16
16
|
const dockerComposeDown = (options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
17
|
logger_1.log.info(`Downing DockerCompose environment`);
|
|
18
18
|
try {
|
|
19
|
-
yield docker_compose_1.down(Object.assign(Object.assign({}, default_docker_compose_options_1.defaultDockerComposeOptions(options)), { commandOptions: ["-v"] }));
|
|
19
|
+
yield (0, docker_compose_1.down)(Object.assign(Object.assign({}, (0, default_docker_compose_options_1.defaultDockerComposeOptions)(options)), { commandOptions: ["-v"] }));
|
|
20
20
|
logger_1.log.info(`Downed DockerCompose environment`);
|
|
21
21
|
}
|
|
22
22
|
catch (err) {
|
|
@@ -16,7 +16,7 @@ const default_docker_compose_options_1 = require("../default-docker-compose-opti
|
|
|
16
16
|
const dockerComposeStop = (options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
17
|
logger_1.log.info(`Stopping DockerCompose environment`);
|
|
18
18
|
try {
|
|
19
|
-
yield docker_compose_1.stop(default_docker_compose_options_1.defaultDockerComposeOptions(options));
|
|
19
|
+
yield (0, docker_compose_1.stop)((0, default_docker_compose_options_1.defaultDockerComposeOptions)(options));
|
|
20
20
|
logger_1.log.info(`Stopped DockerCompose environment`);
|
|
21
21
|
}
|
|
22
22
|
catch (err) {
|
|
@@ -18,10 +18,10 @@ const dockerComposeUp = (options, services) => __awaiter(void 0, void 0, void 0,
|
|
|
18
18
|
logger_1.log.info(`Upping DockerCompose environment`);
|
|
19
19
|
try {
|
|
20
20
|
if (services) {
|
|
21
|
-
yield docker_compose_1.upMany(services, default_docker_compose_options_1.defaultDockerComposeOptions(options));
|
|
21
|
+
yield (0, docker_compose_1.upMany)(services, (0, default_docker_compose_options_1.defaultDockerComposeOptions)(options));
|
|
22
22
|
}
|
|
23
23
|
else {
|
|
24
|
-
yield docker_compose_1.upAll(default_docker_compose_options_1.defaultDockerComposeOptions(options));
|
|
24
|
+
yield (0, docker_compose_1.upAll)((0, default_docker_compose_options_1.defaultDockerComposeOptions)(options));
|
|
25
25
|
}
|
|
26
26
|
logger_1.log.info(`Upped DockerCompose environment`);
|
|
27
27
|
}
|
|
@@ -29,7 +29,7 @@ const dockerComposeUp = (options, services) => __awaiter(void 0, void 0, void 0,
|
|
|
29
29
|
const errorMessage = err.err || err.message || err;
|
|
30
30
|
logger_1.log.error(`Failed to up DockerCompose environment: ${errorMessage}`);
|
|
31
31
|
try {
|
|
32
|
-
yield docker_compose_down_1.dockerComposeDown(options);
|
|
32
|
+
yield (0, docker_compose_down_1.dockerComposeDown)(options);
|
|
33
33
|
}
|
|
34
34
|
catch (_a) {
|
|
35
35
|
logger_1.log.warn(`Failed to down DockerCompose environment after failed up`);
|
|
@@ -89,20 +89,20 @@ class DockerComposeEnvironment {
|
|
|
89
89
|
composeOptions.push("--env-file", this.envFile);
|
|
90
90
|
}
|
|
91
91
|
this.profiles.forEach((profile) => composeOptions.push("--profile", profile));
|
|
92
|
-
yield docker_compose_up_1.dockerComposeUp(Object.assign(Object.assign({}, options), { commandOptions, composeOptions, env: this.env }), services);
|
|
93
|
-
const startedContainers = (yield list_containers_1.listContainers()).filter((container) => container.Labels["com.docker.compose.project"] === this.projectName);
|
|
92
|
+
yield (0, docker_compose_up_1.dockerComposeUp)(Object.assign(Object.assign({}, options), { commandOptions, composeOptions, env: this.env }), services);
|
|
93
|
+
const startedContainers = (yield (0, list_containers_1.listContainers)()).filter((container) => container.Labels["com.docker.compose.project"] === this.projectName);
|
|
94
94
|
const startedContainerNames = startedContainers.reduce((containerNames, startedContainer) => [
|
|
95
95
|
...containerNames,
|
|
96
96
|
startedContainer.Names.join(", "),
|
|
97
97
|
], []);
|
|
98
98
|
logger_1.log.info(`Started the following containers: ${startedContainerNames.join(", ")}`);
|
|
99
99
|
const startedGenericContainers = (yield Promise.all(startedContainers.map((startedContainer) => __awaiter(this, void 0, void 0, function* () {
|
|
100
|
-
const container = yield get_container_1.getContainerById(startedContainer.Id);
|
|
101
|
-
const containerName = container_name_resolver_1.resolveContainerName(this.projectName, startedContainer.Names[0]);
|
|
102
|
-
(yield container_logs_1.containerLogs(container))
|
|
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
|
+
(yield (0, container_logs_1.containerLogs)(container))
|
|
103
103
|
.on("data", (data) => logger_1.containerLog.trace(`${containerName}: ${data}`))
|
|
104
104
|
.on("err", (data) => logger_1.containerLog.error(`${containerName}: ${data}`));
|
|
105
|
-
const inspectResult = yield inspect_container_1.inspectContainer(container);
|
|
105
|
+
const inspectResult = yield (0, inspect_container_1.inspectContainer)(container);
|
|
106
106
|
const boundPorts = bound_ports_1.BoundPorts.fromInspectResult(inspectResult);
|
|
107
107
|
try {
|
|
108
108
|
logger_1.log.info(`Waiting for container ${containerName} to be ready`);
|
|
@@ -112,7 +112,7 @@ class DockerComposeEnvironment {
|
|
|
112
112
|
catch (err) {
|
|
113
113
|
logger_1.log.error(`Container ${containerName} failed to be ready: ${err}`);
|
|
114
114
|
try {
|
|
115
|
-
yield docker_compose_down_1.dockerComposeDown(options);
|
|
115
|
+
yield (0, docker_compose_down_1.dockerComposeDown)(options);
|
|
116
116
|
}
|
|
117
117
|
catch (_a) {
|
|
118
118
|
logger_1.log.warn(`Failed to stop DockerCompose environment after failed up`);
|
|
@@ -22,13 +22,13 @@ class StartedDockerComposeEnvironment {
|
|
|
22
22
|
}
|
|
23
23
|
stop() {
|
|
24
24
|
return __awaiter(this, void 0, void 0, function* () {
|
|
25
|
-
yield docker_compose_stop_1.dockerComposeStop(this.options);
|
|
25
|
+
yield (0, docker_compose_stop_1.dockerComposeStop)(this.options);
|
|
26
26
|
return new stopped_docker_compose_environment_1.StoppedDockerComposeEnvironment(this.options);
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
29
|
down() {
|
|
30
30
|
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
-
yield docker_compose_down_1.dockerComposeDown(this.options);
|
|
31
|
+
yield (0, docker_compose_down_1.dockerComposeDown)(this.options);
|
|
32
32
|
return new downed_docker_compose_environment_1.DownedDockerComposeEnvironment();
|
|
33
33
|
});
|
|
34
34
|
}
|
|
@@ -18,7 +18,7 @@ class StoppedDockerComposeEnvironment {
|
|
|
18
18
|
}
|
|
19
19
|
down() {
|
|
20
20
|
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
-
yield docker_compose_down_1.dockerComposeDown(this.options);
|
|
21
|
+
yield (0, docker_compose_down_1.dockerComposeDown)(this.options);
|
|
22
22
|
return new downed_docker_compose_environment_1.DownedDockerComposeEnvironment();
|
|
23
23
|
});
|
|
24
24
|
}
|
|
@@ -46,9 +46,9 @@ class GenericContainerBuilder {
|
|
|
46
46
|
yield reaper_1.ReaperInstance.getInstance();
|
|
47
47
|
const dockerfile = path_1.default.resolve(this.context, this.dockerfileName);
|
|
48
48
|
logger_1.log.debug(`Preparing to build Dockerfile: ${dockerfile}`);
|
|
49
|
-
const imageNames = yield dockerfile_parser_1.getDockerfileImages(dockerfile);
|
|
49
|
+
const imageNames = yield (0, dockerfile_parser_1.getDockerfileImages)(dockerfile);
|
|
50
50
|
const registryConfig = yield this.getRegistryConfig(imageNames);
|
|
51
|
-
yield build_image_1.buildImage({
|
|
51
|
+
yield (0, build_image_1.buildImage)({
|
|
52
52
|
imageName: imageName,
|
|
53
53
|
context: this.context,
|
|
54
54
|
dockerfileName: this.dockerfileName,
|
|
@@ -57,7 +57,7 @@ class GenericContainerBuilder {
|
|
|
57
57
|
registryConfig,
|
|
58
58
|
});
|
|
59
59
|
const container = new generic_container_1.GenericContainer(imageName.toString());
|
|
60
|
-
if (!(yield image_exists_1.imageExists(imageName))) {
|
|
60
|
+
if (!(yield (0, image_exists_1.imageExists)(imageName))) {
|
|
61
61
|
throw new Error("Failed to build image");
|
|
62
62
|
}
|
|
63
63
|
return Promise.resolve(container);
|
|
@@ -67,7 +67,7 @@ class GenericContainerBuilder {
|
|
|
67
67
|
return __awaiter(this, void 0, void 0, function* () {
|
|
68
68
|
const authConfigs = [];
|
|
69
69
|
yield Promise.all(imageNames.map((imageName) => __awaiter(this, void 0, void 0, function* () {
|
|
70
|
-
const authConfig = yield registry_auth_locator_1.getAuthConfig(imageName.registry);
|
|
70
|
+
const authConfig = yield (0, registry_auth_locator_1.getAuthConfig)(imageName.registry);
|
|
71
71
|
if (authConfig !== undefined) {
|
|
72
72
|
authConfigs.push(authConfig);
|
|
73
73
|
}
|
|
@@ -6,7 +6,7 @@ import { PullPolicy } from "../pull-policy";
|
|
|
6
6
|
import { StartedTestContainer, TestContainer } from "../test-container";
|
|
7
7
|
import { WaitStrategy } from "../wait-strategy";
|
|
8
8
|
import { Readable } from "stream";
|
|
9
|
-
import { BindMode, BindMount, BuildContext, Command, ContainerName, Dir, Env, EnvKey, EnvValue, ExtraHost, HealthCheck, NetworkMode, TmpFs } from "../docker/types";
|
|
9
|
+
import { BindMode, BindMount, BuildContext, Command, ContainerName, Dir, Env, EnvKey, EnvValue, ExtraHost, HealthCheck, NetworkMode, TmpFs, Labels } from "../docker/types";
|
|
10
10
|
import { InspectResult } from "../docker/functions/container/inspect-container";
|
|
11
11
|
import { GenericContainerBuilder } from "./generic-container-builder";
|
|
12
12
|
export declare class GenericContainer implements TestContainer {
|
|
@@ -20,6 +20,7 @@ export declare class GenericContainer implements TestContainer {
|
|
|
20
20
|
protected cmd: Command[];
|
|
21
21
|
protected bindMounts: BindMount[];
|
|
22
22
|
protected name?: ContainerName;
|
|
23
|
+
protected labels: Labels;
|
|
23
24
|
protected tmpFs: TmpFs;
|
|
24
25
|
protected healthCheck?: HealthCheck;
|
|
25
26
|
protected waitStrategy?: WaitStrategy;
|
|
@@ -40,6 +41,7 @@ export declare class GenericContainer implements TestContainer {
|
|
|
40
41
|
protected postStart?(container: StartedTestContainer, inspectResult: InspectResult, boundPorts: BoundPorts): Promise<void>;
|
|
41
42
|
withCmd(cmd: Command[]): this;
|
|
42
43
|
withName(name: ContainerName): this;
|
|
44
|
+
withLabels(labels: Labels): this;
|
|
43
45
|
withEnv(key: EnvKey, value: EnvValue): this;
|
|
44
46
|
withTmpFs(tmpFs: TmpFs): this;
|
|
45
47
|
withNetworkMode(networkMode: NetworkMode): this;
|
|
@@ -46,6 +46,7 @@ class GenericContainer {
|
|
|
46
46
|
this.ports = [];
|
|
47
47
|
this.cmd = [];
|
|
48
48
|
this.bindMounts = [];
|
|
49
|
+
this.labels = {};
|
|
49
50
|
this.tmpFs = {};
|
|
50
51
|
this.startupTimeout = 60000;
|
|
51
52
|
this.useDefaultLogDriver = false;
|
|
@@ -60,10 +61,10 @@ class GenericContainer {
|
|
|
60
61
|
}
|
|
61
62
|
start() {
|
|
62
63
|
return __awaiter(this, void 0, void 0, function* () {
|
|
63
|
-
yield pull_image_1.pullImage({
|
|
64
|
+
yield (0, pull_image_1.pullImage)({
|
|
64
65
|
imageName: this.imageName,
|
|
65
66
|
force: this.pullPolicy.shouldPull(),
|
|
66
|
-
authConfig: yield registry_auth_locator_1.getAuthConfig(this.imageName.registry),
|
|
67
|
+
authConfig: yield (0, registry_auth_locator_1.getAuthConfig)(this.imageName.registry),
|
|
67
68
|
});
|
|
68
69
|
if (!this.imageName.isReaper()) {
|
|
69
70
|
yield reaper_1.ReaperInstance.getInstance();
|
|
@@ -83,6 +84,7 @@ class GenericContainer {
|
|
|
83
84
|
tmpFs: this.tmpFs,
|
|
84
85
|
exposedPorts: this.ports,
|
|
85
86
|
name: this.name,
|
|
87
|
+
labels: this.labels,
|
|
86
88
|
reusable: this.reuse,
|
|
87
89
|
networkMode: this.networkAliases.length > 0 ? undefined : this.networkMode,
|
|
88
90
|
healthCheck: this.healthCheck,
|
|
@@ -94,10 +96,10 @@ class GenericContainer {
|
|
|
94
96
|
user: this.user,
|
|
95
97
|
};
|
|
96
98
|
if (this.reuse) {
|
|
97
|
-
const containerHash = hash_1.hash(JSON.stringify(createContainerOptions));
|
|
99
|
+
const containerHash = (0, hash_1.hash)(JSON.stringify(createContainerOptions));
|
|
98
100
|
createContainerOptions.labels = { [labels_1.LABEL_CONTAINER_HASH]: containerHash };
|
|
99
101
|
logger_1.log.debug(`Container reuse has been enabled, hash: ${containerHash}`);
|
|
100
|
-
const container = yield get_container_1.getContainerByHash(containerHash);
|
|
102
|
+
const container = yield (0, get_container_1.getContainerByHash)(containerHash);
|
|
101
103
|
if (container !== undefined) {
|
|
102
104
|
logger_1.log.debug(`Found container to reuse with hash: ${containerHash}`);
|
|
103
105
|
return this.reuseContainer(container);
|
|
@@ -114,7 +116,7 @@ class GenericContainer {
|
|
|
114
116
|
}
|
|
115
117
|
reuseContainer(startedContainer) {
|
|
116
118
|
return __awaiter(this, void 0, void 0, function* () {
|
|
117
|
-
const inspectResult = yield inspect_container_1.inspectContainer(startedContainer);
|
|
119
|
+
const inspectResult = yield (0, inspect_container_1.inspectContainer)(startedContainer);
|
|
118
120
|
const boundPorts = bound_ports_1.BoundPorts.fromInspectResult(inspectResult).filter(this.ports);
|
|
119
121
|
yield this.waitForContainer(startedContainer, boundPorts);
|
|
120
122
|
return new started_generic_container_1.StartedGenericContainer(startedContainer, (yield docker_client_1.dockerClient).host, inspectResult, boundPorts, inspectResult.name);
|
|
@@ -122,13 +124,13 @@ class GenericContainer {
|
|
|
122
124
|
}
|
|
123
125
|
startContainer(createContainerOptions) {
|
|
124
126
|
return __awaiter(this, void 0, void 0, function* () {
|
|
125
|
-
const container = yield create_container_1.createContainer(createContainerOptions);
|
|
127
|
+
const container = yield (0, create_container_1.createContainer)(createContainerOptions);
|
|
126
128
|
if (!this.imageName.isHelperContainer() && port_forwarder_1.PortForwarderInstance.isRunning()) {
|
|
127
129
|
const portForwarder = yield port_forwarder_1.PortForwarderInstance.getInstance();
|
|
128
130
|
const portForwarderNetworkId = portForwarder.getNetworkId();
|
|
129
131
|
const excludedNetworks = [portForwarderNetworkId, "none", "host"];
|
|
130
132
|
if (!this.networkMode || !excludedNetworks.includes(this.networkMode)) {
|
|
131
|
-
yield connect_network_1.connectNetwork({
|
|
133
|
+
yield (0, connect_network_1.connectNetwork)({
|
|
132
134
|
containerId: container.id,
|
|
133
135
|
networkId: portForwarderNetworkId,
|
|
134
136
|
networkAliases: [],
|
|
@@ -136,7 +138,7 @@ class GenericContainer {
|
|
|
136
138
|
}
|
|
137
139
|
}
|
|
138
140
|
if (this.networkMode && this.networkAliases.length > 0) {
|
|
139
|
-
yield connect_network_1.connectNetwork({
|
|
141
|
+
yield (0, connect_network_1.connectNetwork)({
|
|
140
142
|
containerId: container.id,
|
|
141
143
|
networkId: this.networkMode,
|
|
142
144
|
networkAliases: this.networkAliases,
|
|
@@ -144,14 +146,14 @@ class GenericContainer {
|
|
|
144
146
|
}
|
|
145
147
|
if (this.tarToCopy) {
|
|
146
148
|
yield this.tarToCopy.finalize();
|
|
147
|
-
yield put_container_archive_1.putContainerArchive({ container, stream: this.tarToCopy, containerPath: "/" });
|
|
149
|
+
yield (0, put_container_archive_1.putContainerArchive)({ container, stream: this.tarToCopy, containerPath: "/" });
|
|
148
150
|
}
|
|
149
151
|
logger_1.log.info(`Starting container ${this.imageName} with ID: ${container.id}`);
|
|
150
|
-
yield start_container_1.startContainer(container);
|
|
151
|
-
(yield container_logs_1.containerLogs(container))
|
|
152
|
+
yield (0, start_container_1.startContainer)(container);
|
|
153
|
+
(yield (0, container_logs_1.containerLogs)(container))
|
|
152
154
|
.on("data", (data) => logger_1.containerLog.trace(`${container.id}: ${data.trim()}`))
|
|
153
155
|
.on("err", (data) => logger_1.containerLog.error(`${container.id}: ${data.trim()}`));
|
|
154
|
-
const inspectResult = yield inspect_container_1.inspectContainer(container);
|
|
156
|
+
const inspectResult = yield (0, inspect_container_1.inspectContainer)(container);
|
|
155
157
|
const boundPorts = bound_ports_1.BoundPorts.fromInspectResult(inspectResult).filter(this.ports);
|
|
156
158
|
yield this.waitForContainer(container, boundPorts);
|
|
157
159
|
const startedContainer = new started_generic_container_1.StartedGenericContainer(container, (yield docker_client_1.dockerClient).host, inspectResult, boundPorts, inspectResult.name);
|
|
@@ -169,6 +171,10 @@ class GenericContainer {
|
|
|
169
171
|
this.name = name;
|
|
170
172
|
return this;
|
|
171
173
|
}
|
|
174
|
+
withLabels(labels) {
|
|
175
|
+
this.labels = Object.assign({}, labels);
|
|
176
|
+
return this;
|
|
177
|
+
}
|
|
172
178
|
withEnv(key, value) {
|
|
173
179
|
this.env[key] = value;
|
|
174
180
|
return this;
|
|
@@ -247,7 +253,7 @@ class GenericContainer {
|
|
|
247
253
|
}
|
|
248
254
|
getTarToCopy() {
|
|
249
255
|
if (!this.tarToCopy) {
|
|
250
|
-
this.tarToCopy = archiver_1.default("tar");
|
|
256
|
+
this.tarToCopy = (0, archiver_1.default)("tar");
|
|
251
257
|
}
|
|
252
258
|
return this.tarToCopy;
|
|
253
259
|
}
|
|
@@ -262,8 +268,8 @@ class GenericContainer {
|
|
|
262
268
|
catch (err) {
|
|
263
269
|
logger_1.log.error(`Container failed to be ready: ${err}`);
|
|
264
270
|
try {
|
|
265
|
-
yield stop_container_1.stopContainer(container, { timeout: 0 });
|
|
266
|
-
yield remove_container_1.removeContainer(container, { removeVolumes: true });
|
|
271
|
+
yield (0, stop_container_1.stopContainer)(container, { timeout: 0 });
|
|
272
|
+
yield (0, remove_container_1.removeContainer)(container, { removeVolumes: true });
|
|
267
273
|
}
|
|
268
274
|
catch (stopErr) {
|
|
269
275
|
logger_1.log.error(`Failed to stop container after it failed to be ready: ${stopErr}`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { StartedTestContainer, StopOptions, StoppedTestContainer } from "../test-container";
|
|
3
3
|
import Dockerode from "dockerode";
|
|
4
|
-
import { Command, ContainerName, ExecResult, Host, Id as ContainerId } from "../docker/types";
|
|
4
|
+
import { Command, ContainerName, ExecResult, Host, Id as ContainerId, Labels } from "../docker/types";
|
|
5
5
|
import { InspectResult } from "../docker/functions/container/inspect-container";
|
|
6
6
|
import { BoundPorts } from "../bound-ports";
|
|
7
7
|
import { Port } from "../port";
|
|
@@ -19,6 +19,7 @@ export declare class StartedGenericContainer implements StartedTestContainer {
|
|
|
19
19
|
getMappedPort(port: Port): Port;
|
|
20
20
|
getId(): ContainerId;
|
|
21
21
|
getName(): ContainerName;
|
|
22
|
+
getLabels(): Labels;
|
|
22
23
|
getNetworkNames(): string[];
|
|
23
24
|
getNetworkId(networkName: string): string;
|
|
24
25
|
getIpAddress(networkName: string): string;
|
|
@@ -33,8 +33,8 @@ class StartedGenericContainer {
|
|
|
33
33
|
return __awaiter(this, void 0, void 0, function* () {
|
|
34
34
|
logger_1.log.info(`Stopping container with ID: ${this.container.id}`);
|
|
35
35
|
const resolvedOptions = Object.assign({ timeout: 0, removeVolumes: true }, options);
|
|
36
|
-
yield stop_container_1.stopContainer(this.container, { timeout: resolvedOptions.timeout });
|
|
37
|
-
yield remove_container_1.removeContainer(this.container, { removeVolumes: resolvedOptions.removeVolumes });
|
|
36
|
+
yield (0, stop_container_1.stopContainer)(this.container, { timeout: resolvedOptions.timeout });
|
|
37
|
+
yield (0, remove_container_1.removeContainer)(this.container, { removeVolumes: resolvedOptions.removeVolumes });
|
|
38
38
|
return new stopped_generic_container_1.StoppedGenericContainer();
|
|
39
39
|
});
|
|
40
40
|
}
|
|
@@ -50,6 +50,9 @@ class StartedGenericContainer {
|
|
|
50
50
|
getName() {
|
|
51
51
|
return this.name;
|
|
52
52
|
}
|
|
53
|
+
getLabels() {
|
|
54
|
+
return this.inspectResult.labels;
|
|
55
|
+
}
|
|
53
56
|
getNetworkNames() {
|
|
54
57
|
return Object.keys(this.inspectResult.networkSettings);
|
|
55
58
|
}
|
|
@@ -60,10 +63,10 @@ class StartedGenericContainer {
|
|
|
60
63
|
return this.inspectResult.networkSettings[networkName].ipAddress;
|
|
61
64
|
}
|
|
62
65
|
exec(command) {
|
|
63
|
-
return exec_container_1.execContainer(this.container, command);
|
|
66
|
+
return (0, exec_container_1.execContainer)(this.container, command);
|
|
64
67
|
}
|
|
65
68
|
logs() {
|
|
66
|
-
return container_logs_1.containerLogs(this.container);
|
|
69
|
+
return (0, container_logs_1.containerLogs)(this.container);
|
|
67
70
|
}
|
|
68
71
|
}
|
|
69
72
|
exports.StartedGenericContainer = StartedGenericContainer;
|
|
@@ -16,7 +16,7 @@ const get_info_1 = require("./docker/functions/get-info");
|
|
|
16
16
|
const logSystemDiagnostics = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
17
|
const info = {
|
|
18
18
|
node: getNodeInfo(),
|
|
19
|
-
docker: yield get_info_1.getDockerInfo(),
|
|
19
|
+
docker: yield (0, get_info_1.getDockerInfo)(),
|
|
20
20
|
dockerCompose: yield getDockerComposeInfo(),
|
|
21
21
|
};
|
|
22
22
|
logger_1.log.debug(`System diagnostics: ${JSON.stringify(info)}`);
|
|
@@ -32,7 +32,7 @@ const getNodeInfo = () => {
|
|
|
32
32
|
const getDockerComposeInfo = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
33
|
try {
|
|
34
34
|
return {
|
|
35
|
-
version: (yield docker_compose_1.version()).data.version,
|
|
35
|
+
version: (yield (0, docker_compose_1.version)()).data.version,
|
|
36
36
|
};
|
|
37
37
|
}
|
|
38
38
|
catch (err) {
|
package/dist/logger.js
CHANGED
|
@@ -7,7 +7,7 @@ exports.containerLog = exports.log = exports.FakeLogger = void 0;
|
|
|
7
7
|
const debug_1 = __importDefault(require("debug"));
|
|
8
8
|
class DebugLogger {
|
|
9
9
|
constructor(namespace) {
|
|
10
|
-
this.logger = debug_1.default(namespace);
|
|
10
|
+
this.logger = (0, debug_1.default)(namespace);
|
|
11
11
|
}
|
|
12
12
|
trace(message) {
|
|
13
13
|
this.logger(`TRACE ${message}`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { StartedTestContainer, StopOptions, StoppedTestContainer } from "../test-container";
|
|
3
3
|
import { Port } from "../port";
|
|
4
|
-
import { ContainerName, Host, Id, Command, ExecResult } from "../docker/types";
|
|
4
|
+
import { ContainerName, Host, Id, Command, ExecResult, Labels } from "../docker/types";
|
|
5
5
|
import { Readable } from "stream";
|
|
6
6
|
export declare class AbstractStartedContainer {
|
|
7
7
|
protected readonly startedTestContainer: StartedTestContainer;
|
|
@@ -10,6 +10,7 @@ export declare class AbstractStartedContainer {
|
|
|
10
10
|
getHost(): Host;
|
|
11
11
|
getMappedPort(port: Port): Port;
|
|
12
12
|
getName(): ContainerName;
|
|
13
|
+
getLabels(): Labels;
|
|
13
14
|
getId(): Id;
|
|
14
15
|
getNetworkNames(): string[];
|
|
15
16
|
getNetworkId(networkName: string): string;
|
|
@@ -8,7 +8,6 @@ import { InspectResult } from "../../docker/functions/container/inspect-containe
|
|
|
8
8
|
export declare const KAFKA_IMAGE = "confluentinc/cp-kafka:5.5.4";
|
|
9
9
|
export declare class KafkaContainer extends GenericContainer {
|
|
10
10
|
private readonly uuid;
|
|
11
|
-
private readonly portGenerator;
|
|
12
11
|
private isZooKeeperProvided;
|
|
13
12
|
private zooKeeperHost?;
|
|
14
13
|
private zooKeeperPort?;
|
|
@@ -13,16 +13,15 @@ exports.StartedKafkaContainer = exports.KafkaContainer = exports.KAFKA_IMAGE = v
|
|
|
13
13
|
const generic_container_1 = require("../../generic-container/generic-container");
|
|
14
14
|
const uuid_1 = require("../../uuid");
|
|
15
15
|
const abstract_started_container_1 = require("../abstract-started-container");
|
|
16
|
-
const port_generator_1 = require("../../port-generator");
|
|
17
16
|
const docker_client_1 = require("../../docker/docker-client");
|
|
18
17
|
const KAFKA_PORT = 9093;
|
|
19
18
|
const KAFKA_BROKER_PORT = 9092;
|
|
19
|
+
const DEFAULT_ZOOKEEPER_PORT = 2181;
|
|
20
20
|
exports.KAFKA_IMAGE = "confluentinc/cp-kafka:5.5.4";
|
|
21
21
|
class KafkaContainer extends generic_container_1.GenericContainer {
|
|
22
22
|
constructor(image = exports.KAFKA_IMAGE) {
|
|
23
23
|
super(image);
|
|
24
24
|
this.uuid = new uuid_1.RandomUuid();
|
|
25
|
-
this.portGenerator = new port_generator_1.RandomUniquePortGenerator();
|
|
26
25
|
this.isZooKeeperProvided = false;
|
|
27
26
|
this.withExposedPorts(KAFKA_PORT)
|
|
28
27
|
.withStartupTimeout(180000)
|
|
@@ -53,7 +52,7 @@ class KafkaContainer extends generic_container_1.GenericContainer {
|
|
|
53
52
|
}
|
|
54
53
|
else {
|
|
55
54
|
this.zooKeeperHost = this.uuid.nextUuid();
|
|
56
|
-
this.zooKeeperPort =
|
|
55
|
+
this.zooKeeperPort = DEFAULT_ZOOKEEPER_PORT;
|
|
57
56
|
this.addExposedPorts(this.zooKeeperPort);
|
|
58
57
|
this.withEnv("KAFKA_ZOOKEEPER_CONNECT", `localhost:${this.zooKeeperPort}`);
|
|
59
58
|
command += "echo 'clientPort=" + this.zooKeeperPort + "' > zookeeper.properties\n";
|
package/dist/network.js
CHANGED
|
@@ -22,7 +22,7 @@ class Network {
|
|
|
22
22
|
start() {
|
|
23
23
|
return __awaiter(this, void 0, void 0, function* () {
|
|
24
24
|
yield reaper_1.ReaperInstance.getInstance();
|
|
25
|
-
const id = yield create_network_1.createNetwork(this.createNetworkOptions);
|
|
25
|
+
const id = yield (0, create_network_1.createNetwork)(this.createNetworkOptions);
|
|
26
26
|
logger_1.log.info(`Started network with ID: ${id}`);
|
|
27
27
|
return new StartedNetwork(id, this.createNetworkOptions);
|
|
28
28
|
});
|
|
@@ -43,7 +43,7 @@ class StartedNetwork {
|
|
|
43
43
|
stop() {
|
|
44
44
|
return __awaiter(this, void 0, void 0, function* () {
|
|
45
45
|
logger_1.log.info(`Stopping network with ID: ${this.id}`);
|
|
46
|
-
yield remove_network_1.removeNetwork(this.id);
|
|
46
|
+
yield (0, remove_network_1.removeNetwork)(this.id);
|
|
47
47
|
return new StoppedNetwork();
|
|
48
48
|
});
|
|
49
49
|
}
|
package/dist/port-check.js
CHANGED
|
@@ -49,7 +49,7 @@ class InternalPortCheck {
|
|
|
49
49
|
["/bin/sh", "-c", `nc -vz -w 1 localhost ${port}`],
|
|
50
50
|
["/bin/bash", "-c", `</dev/tcp/localhost/${port}`],
|
|
51
51
|
];
|
|
52
|
-
const commandResults = yield Promise.all(commands.map((command) => exec_container_1.execContainer(this.container, command)));
|
|
52
|
+
const commandResults = yield Promise.all(commands.map((command) => (0, exec_container_1.execContainer)(this.container, command)));
|
|
53
53
|
return commandResults.some((result) => result.exitCode === 0);
|
|
54
54
|
});
|
|
55
55
|
}
|
package/dist/port-forwarder.js
CHANGED
|
@@ -69,7 +69,7 @@ class PortForwarderInstance {
|
|
|
69
69
|
const host = (yield docker_client_1.dockerClient).host;
|
|
70
70
|
const port = container.getMappedPort(22);
|
|
71
71
|
logger_1.log.debug(`Connecting to Port Forwarder on ${host}:${port}`);
|
|
72
|
-
const connection = yield ssh_remote_port_forward_1.createSshConnection({ host, port, username, password });
|
|
72
|
+
const connection = yield (0, ssh_remote_port_forward_1.createSshConnection)({ host, port, username, password });
|
|
73
73
|
connection.unref();
|
|
74
74
|
return new PortForwarder(connection, container);
|
|
75
75
|
});
|
package/dist/port-generator.js
CHANGED
|
@@ -16,7 +16,7 @@ exports.FixedPortGenerator = exports.RandomUniquePortGenerator = void 0;
|
|
|
16
16
|
const get_port_1 = __importDefault(require("get-port"));
|
|
17
17
|
class RandomPortGenerator {
|
|
18
18
|
generatePort() {
|
|
19
|
-
return get_port_1.default({ port: this.randomBetweenInclusive(10000, 65535) });
|
|
19
|
+
return (0, get_port_1.default)({ port: this.randomBetweenInclusive(10000, 65535) });
|
|
20
20
|
}
|
|
21
21
|
randomBetweenInclusive(min, max) {
|
|
22
22
|
return Math.floor(Math.random() * (max - min + 1) + min);
|
package/dist/reaper.js
CHANGED
|
@@ -14,7 +14,6 @@ const net_1 = require("net");
|
|
|
14
14
|
const logger_1 = require("./logger");
|
|
15
15
|
const generic_container_1 = require("./generic-container/generic-container");
|
|
16
16
|
const session_id_1 = require("./docker/session-id");
|
|
17
|
-
const docker_client_1 = require("./docker/docker-client");
|
|
18
17
|
const images_1 = require("./images");
|
|
19
18
|
const port_1 = require("./port");
|
|
20
19
|
const labels_1 = require("./labels");
|
|
@@ -93,7 +92,7 @@ class ReaperInstance {
|
|
|
93
92
|
}
|
|
94
93
|
const startedContainer = yield container.start();
|
|
95
94
|
const containerId = startedContainer.getId();
|
|
96
|
-
const host = (
|
|
95
|
+
const host = startedContainer.getHost();
|
|
97
96
|
const port = startedContainer.getMappedPort(8080);
|
|
98
97
|
logger_1.log.debug(`Connecting to Reaper ${containerId} on ${host}:${port}`);
|
|
99
98
|
const socket = new net_1.Socket();
|
|
@@ -110,7 +109,7 @@ class ReaperInstance {
|
|
|
110
109
|
}
|
|
111
110
|
});
|
|
112
111
|
return new Promise((resolve) => {
|
|
113
|
-
socket.connect(port_1.getContainerPort(port), host, () => {
|
|
112
|
+
socket.connect((0, port_1.getContainerPort)(port), host, () => {
|
|
114
113
|
logger_1.log.debug(`Connected to Reaper ${containerId}`);
|
|
115
114
|
socket.write(`label=${labels_1.LABEL_SESSION_ID}=${session_id_1.sessionId}\r\n`);
|
|
116
115
|
const reaper = new RealReaper(startedContainer, socket);
|
|
@@ -38,7 +38,7 @@ class CredentialProvider {
|
|
|
38
38
|
}
|
|
39
39
|
listCredentials(providerName) {
|
|
40
40
|
return new Promise((resolve, reject) => {
|
|
41
|
-
child_process_1.exec(`${providerName} list`, (err, stdout) => {
|
|
41
|
+
(0, child_process_1.exec)(`${providerName} list`, (err, stdout) => {
|
|
42
42
|
if (err) {
|
|
43
43
|
logger_1.log.error("An error occurred listing credentials");
|
|
44
44
|
return reject(err);
|
|
@@ -55,7 +55,7 @@ class CredentialProvider {
|
|
|
55
55
|
}
|
|
56
56
|
runCredentialProvider(registry, providerName) {
|
|
57
57
|
return new Promise((resolve) => {
|
|
58
|
-
const sink = child_process_1.spawn(providerName, ["get"]);
|
|
58
|
+
const sink = (0, child_process_1.spawn)(providerName, ["get"]);
|
|
59
59
|
const chunks = [];
|
|
60
60
|
sink.stdout.on("data", (chunk) => chunks.push(chunk));
|
|
61
61
|
sink.on("close", (code) => {
|
|
@@ -24,7 +24,7 @@ const DEFAULT_REGISTRY = "https://index.docker.io/v1/";
|
|
|
24
24
|
const dockerConfigLocation = process.env.DOCKER_CONFIG || `${os_1.default.homedir()}/.docker`;
|
|
25
25
|
const dockerConfigFile = path_1.default.resolve(dockerConfigLocation, "config.json");
|
|
26
26
|
const readDockerConfig = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
27
|
-
if (!fs_1.existsSync(dockerConfigFile)) {
|
|
27
|
+
if (!(0, fs_1.existsSync)(dockerConfigFile)) {
|
|
28
28
|
return Promise.resolve({});
|
|
29
29
|
}
|
|
30
30
|
const buffer = yield fs_1.promises.readFile(dockerConfigFile);
|
package/dist/test-container.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { Port, PortWithOptionalBinding } from "./port";
|
|
|
3
3
|
import { PullPolicy } from "./pull-policy";
|
|
4
4
|
import { WaitStrategy } from "./wait-strategy";
|
|
5
5
|
import { Readable } from "stream";
|
|
6
|
-
import { BindMode, Command, ContainerName, Dir, EnvKey, EnvValue, ExecResult, ExtraHost, Host, Id, NetworkMode, TmpFs } from "./docker/types";
|
|
6
|
+
import { BindMode, Command, ContainerName, Dir, EnvKey, EnvValue, ExecResult, ExtraHost, Host, Id, NetworkMode, TmpFs, Labels } from "./docker/types";
|
|
7
7
|
export interface TestContainer {
|
|
8
8
|
start(): Promise<StartedTestContainer>;
|
|
9
9
|
withEnv(key: EnvKey, value: EnvValue): this;
|
|
@@ -32,6 +32,7 @@ export interface StartedTestContainer {
|
|
|
32
32
|
getHost(): Host;
|
|
33
33
|
getMappedPort(port: Port): Port;
|
|
34
34
|
getName(): ContainerName;
|
|
35
|
+
getLabels(): Labels;
|
|
35
36
|
getId(): Id;
|
|
36
37
|
getNetworkNames(): string[];
|
|
37
38
|
getNetworkId(networkName: string): string;
|
|
@@ -8,11 +8,11 @@ const logger_1 = require("./logger");
|
|
|
8
8
|
const os_1 = require("os");
|
|
9
9
|
const fs_1 = require("fs");
|
|
10
10
|
const properties_reader_1 = __importDefault(require("properties-reader"));
|
|
11
|
-
const file = path_1.default.resolve(os_1.homedir(), ".testcontainers.properties");
|
|
12
|
-
if (fs_1.existsSync(file)) {
|
|
11
|
+
const file = path_1.default.resolve((0, os_1.homedir)(), ".testcontainers.properties");
|
|
12
|
+
if ((0, fs_1.existsSync)(file)) {
|
|
13
13
|
logger_1.log.debug("Found .testcontainers.properties file");
|
|
14
|
-
const string = fs_1.readFileSync(file, { encoding: "utf-8" });
|
|
15
|
-
const properties = properties_reader_1.default("").read(string);
|
|
14
|
+
const string = (0, fs_1.readFileSync)(file, { encoding: "utf-8" });
|
|
15
|
+
const properties = (0, properties_reader_1.default)("").read(string);
|
|
16
16
|
const host = properties.get("docker.host");
|
|
17
17
|
if (host !== null) {
|
|
18
18
|
logger_1.log.debug(`Setting DOCKER_HOST to ${host}`);
|
package/dist/wait-strategy.js
CHANGED
|
@@ -75,7 +75,7 @@ class LogWaitStrategy extends AbstractWaitStrategy {
|
|
|
75
75
|
waitUntilReady(container) {
|
|
76
76
|
return __awaiter(this, void 0, void 0, function* () {
|
|
77
77
|
logger_1.log.debug(`Waiting for log message "${this.message}"`);
|
|
78
|
-
const stream = yield container_logs_1.containerLogs(container);
|
|
78
|
+
const stream = yield (0, container_logs_1.containerLogs)(container);
|
|
79
79
|
return new Promise((resolve, reject) => {
|
|
80
80
|
const startupTimeout = this.startupTimeout;
|
|
81
81
|
const timeout = setTimeout(() => {
|
|
@@ -98,7 +98,7 @@ class LogWaitStrategy extends AbstractWaitStrategy {
|
|
|
98
98
|
resolve();
|
|
99
99
|
}
|
|
100
100
|
};
|
|
101
|
-
byline_1.default(stream)
|
|
101
|
+
(0, byline_1.default)(stream)
|
|
102
102
|
.on("data", lineProcessor)
|
|
103
103
|
.on("err", lineProcessor)
|
|
104
104
|
.on("end", () => {
|
|
@@ -116,7 +116,7 @@ class HealthCheckWaitStrategy extends AbstractWaitStrategy {
|
|
|
116
116
|
return __awaiter(this, void 0, void 0, function* () {
|
|
117
117
|
logger_1.log.debug(`Waiting for health check`);
|
|
118
118
|
const retryStrategy = new retry_strategy_1.IntervalRetryStrategy(100);
|
|
119
|
-
const status = yield retryStrategy.retryUntil(() => __awaiter(this, void 0, void 0, function* () { return (yield inspect_container_1.inspectContainer(container)).healthCheckStatus; }), (healthCheckStatus) => healthCheckStatus === "healthy" || healthCheckStatus === "unhealthy", () => {
|
|
119
|
+
const status = yield retryStrategy.retryUntil(() => __awaiter(this, void 0, void 0, function* () { return (yield (0, inspect_container_1.inspectContainer)(container)).healthCheckStatus; }), (healthCheckStatus) => healthCheckStatus === "healthy" || healthCheckStatus === "unhealthy", () => {
|
|
120
120
|
const timeout = this.startupTimeout;
|
|
121
121
|
throw new Error(`Health check not healthy after ${timeout}ms for ${container.id}`);
|
|
122
122
|
}, this.startupTimeout);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "testcontainers",
|
|
3
3
|
"author": "Cristian Greco",
|
|
4
|
-
"version": "8.
|
|
4
|
+
"version": "8.7.2",
|
|
5
5
|
"main": "dist/index",
|
|
6
6
|
"types": "dist/index",
|
|
7
7
|
"keywords": [
|
|
@@ -33,9 +33,9 @@
|
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@balena/dockerignore": "^1.0.2",
|
|
36
|
-
"@types/archiver": "^5.
|
|
37
|
-
"@types/dockerode": "^3.
|
|
38
|
-
"archiver": "^5.3.
|
|
36
|
+
"@types/archiver": "^5.3.1",
|
|
37
|
+
"@types/dockerode": "^3.3.8",
|
|
38
|
+
"archiver": "^5.3.1",
|
|
39
39
|
"byline": "^5.0.0",
|
|
40
40
|
"debug": "^4.3.4",
|
|
41
41
|
"docker-compose": "^0.23.17",
|
|
@@ -46,34 +46,34 @@
|
|
|
46
46
|
"tar-fs": "^2.1.1"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@elastic/elasticsearch": "^7.
|
|
49
|
+
"@elastic/elasticsearch": "^7.17.0",
|
|
50
50
|
"@types/byline": "^4.2.33",
|
|
51
51
|
"@types/debug": "4.1.7",
|
|
52
|
-
"@types/jest": "^27.
|
|
53
|
-
"@types/node": "^
|
|
54
|
-
"@types/node-fetch": "^2.
|
|
52
|
+
"@types/jest": "^27.4.1",
|
|
53
|
+
"@types/node": "^17.0.25",
|
|
54
|
+
"@types/node-fetch": "^2.6.1",
|
|
55
55
|
"@types/pg": "^8.6.5",
|
|
56
56
|
"@types/properties-reader": "^2.1.1",
|
|
57
57
|
"@types/tar-fs": "^2.0.1",
|
|
58
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
59
|
-
"@typescript-eslint/parser": "^
|
|
60
|
-
"arangojs": "^7.
|
|
58
|
+
"@typescript-eslint/eslint-plugin": "^5.19.0",
|
|
59
|
+
"@typescript-eslint/parser": "^5.19.0",
|
|
60
|
+
"arangojs": "^7.7.0",
|
|
61
61
|
"cross-env": "^7.0.3",
|
|
62
|
-
"eslint": "^
|
|
63
|
-
"eslint-config-prettier": "^8.
|
|
62
|
+
"eslint": "^8.13.0",
|
|
63
|
+
"eslint-config-prettier": "^8.5.0",
|
|
64
64
|
"husky": "^7.0.4",
|
|
65
|
-
"jest": "^27.
|
|
66
|
-
"kafkajs": "^1.
|
|
67
|
-
"lint-staged": "^
|
|
65
|
+
"jest": "^27.5.1",
|
|
66
|
+
"kafkajs": "^1.16.0",
|
|
67
|
+
"lint-staged": "^12.3.8",
|
|
68
68
|
"mysql2": "^2.3.3",
|
|
69
|
-
"neo4j-driver": "^4.
|
|
69
|
+
"neo4j-driver": "^4.4.5",
|
|
70
70
|
"node-fetch": "^2.6.7",
|
|
71
71
|
"pg": "^8.7.3",
|
|
72
|
-
"prettier": "^2.
|
|
72
|
+
"prettier": "^2.6.2",
|
|
73
73
|
"rimraf": "^3.0.2",
|
|
74
|
-
"ts-jest": "^27.
|
|
75
|
-
"ts-node": "^10.
|
|
76
|
-
"typescript": "^4.3
|
|
74
|
+
"ts-jest": "^27.1.4",
|
|
75
|
+
"ts-node": "^10.7.0",
|
|
76
|
+
"typescript": "^4.6.3",
|
|
77
77
|
"wait-for-expect": "^3.0.2"
|
|
78
78
|
},
|
|
79
79
|
"lint-staged": {
|