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.
Files changed (182) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/src/bound-ports.d.ts +12 -0
  3. package/dist/src/bound-ports.js +50 -0
  4. package/dist/src/clock.d.ts +7 -0
  5. package/dist/src/clock.js +9 -0
  6. package/dist/src/docker/docker-client-config.d.ts +10 -0
  7. package/dist/src/docker/docker-client-config.js +66 -0
  8. package/dist/src/docker/docker-client.d.ts +24 -0
  9. package/dist/src/docker/docker-client.js +198 -0
  10. package/dist/src/docker/functions/container/attach-container.d.ts +3 -0
  11. package/dist/src/docker/functions/container/attach-container.js +25 -0
  12. package/dist/src/docker/functions/container/container-logs.d.ts +6 -0
  13. package/dist/src/docker/functions/container/container-logs.js +32 -0
  14. package/dist/src/docker/functions/container/create-container.d.ts +30 -0
  15. package/dist/src/docker/functions/container/create-container.js +114 -0
  16. package/dist/src/docker/functions/container/exec-container.d.ts +9 -0
  17. package/dist/src/docker/functions/container/exec-container.js +59 -0
  18. package/dist/src/docker/functions/container/get-container.d.ts +3 -0
  19. package/dist/src/docker/functions/container/get-container.js +49 -0
  20. package/dist/src/docker/functions/container/inspect-container.d.ts +19 -0
  21. package/dist/src/docker/functions/container/inspect-container.js +67 -0
  22. package/dist/src/docker/functions/container/list-containers.d.ts +2 -0
  23. package/dist/src/docker/functions/container/list-containers.js +25 -0
  24. package/dist/src/docker/functions/container/put-container-archive.d.ts +9 -0
  25. package/dist/src/docker/functions/container/put-container-archive.js +23 -0
  26. package/dist/src/docker/functions/container/remove-container.d.ts +5 -0
  27. package/dist/src/docker/functions/container/remove-container.js +23 -0
  28. package/dist/src/docker/functions/container/restart-container.d.ts +5 -0
  29. package/dist/src/docker/functions/container/restart-container.js +23 -0
  30. package/dist/src/docker/functions/container/start-container.d.ts +2 -0
  31. package/dist/src/docker/functions/container/start-container.js +23 -0
  32. package/dist/src/docker/functions/container/stop-container.d.ts +5 -0
  33. package/dist/src/docker/functions/container/stop-container.js +29 -0
  34. package/dist/src/docker/functions/create-labels.d.ts +3 -0
  35. package/dist/src/docker/functions/create-labels.js +17 -0
  36. package/dist/src/docker/functions/demux-stream.d.ts +3 -0
  37. package/dist/src/docker/functions/demux-stream.js +32 -0
  38. package/dist/src/docker/functions/get-info.d.ts +11 -0
  39. package/dist/src/docker/functions/get-info.js +38 -0
  40. package/dist/src/docker/functions/image/build-image.d.ts +13 -0
  41. package/dist/src/docker/functions/image/build-image.js +76 -0
  42. package/dist/src/docker/functions/image/image-exists.d.ts +3 -0
  43. package/dist/src/docker/functions/image/image-exists.js +34 -0
  44. package/dist/src/docker/functions/image/list-images.d.ts +3 -0
  45. package/dist/src/docker/functions/image/list-images.js +34 -0
  46. package/dist/src/docker/functions/image/pull-image.d.ts +7 -0
  47. package/dist/src/docker/functions/image/pull-image.js +41 -0
  48. package/dist/src/docker/functions/network/connect-network.d.ts +6 -0
  49. package/dist/src/docker/functions/network/connect-network.js +27 -0
  50. package/dist/src/docker/functions/network/create-network.d.ts +16 -0
  51. package/dist/src/docker/functions/network/create-network.js +38 -0
  52. package/dist/src/docker/functions/network/remove-network.d.ts +1 -0
  53. package/dist/src/docker/functions/network/remove-network.js +30 -0
  54. package/dist/src/docker/functions/run-in-container.d.ts +2 -0
  55. package/dist/src/docker/functions/run-in-container.js +39 -0
  56. package/dist/src/docker/get-remote-docker-unix-socket-path.d.ts +5 -0
  57. package/dist/src/docker/get-remote-docker-unix-socket-path.js +17 -0
  58. package/dist/src/docker/lookup-host-ips.d.ts +5 -0
  59. package/dist/src/docker/lookup-host-ips.js +26 -0
  60. package/dist/src/docker/pull-stream-parser.d.ts +11 -0
  61. package/dist/src/docker/pull-stream-parser.js +63 -0
  62. package/dist/src/docker/rootless-unix-socket-strategy.d.ts +16 -0
  63. package/dist/src/docker/rootless-unix-socket-strategy.js +69 -0
  64. package/dist/src/docker/session-id.d.ts +1 -0
  65. package/dist/src/docker/session-id.js +5 -0
  66. package/dist/src/docker/types.d.ts +79 -0
  67. package/dist/src/docker/types.js +2 -0
  68. package/dist/src/docker-compose/default-docker-compose-options.d.ts +3 -0
  69. package/dist/src/docker-compose/default-docker-compose-options.js +37 -0
  70. package/dist/src/docker-compose/docker-compose-options.d.ts +9 -0
  71. package/dist/src/docker-compose/docker-compose-options.js +2 -0
  72. package/dist/src/docker-compose/functions/container-name-resolver.d.ts +1 -0
  73. package/dist/src/docker-compose/functions/container-name-resolver.js +15 -0
  74. package/dist/src/docker-compose/functions/docker-compose-down.d.ts +3 -0
  75. package/dist/src/docker-compose/functions/docker-compose-down.js +39 -0
  76. package/dist/src/docker-compose/functions/docker-compose-stop.d.ts +2 -0
  77. package/dist/src/docker-compose/functions/docker-compose-stop.js +29 -0
  78. package/dist/src/docker-compose/functions/docker-compose-up.d.ts +2 -0
  79. package/dist/src/docker-compose/functions/docker-compose-up.js +41 -0
  80. package/dist/src/docker-compose-environment/docker-compose-environment.d.ts +25 -0
  81. package/dist/src/docker-compose-environment/docker-compose-environment.js +134 -0
  82. package/dist/src/docker-compose-environment/downed-docker-compose-environment.d.ts +2 -0
  83. package/dist/src/docker-compose-environment/downed-docker-compose-environment.js +6 -0
  84. package/dist/src/docker-compose-environment/started-docker-compose-environment.d.ts +15 -0
  85. package/dist/src/docker-compose-environment/started-docker-compose-environment.js +46 -0
  86. package/dist/src/docker-compose-environment/stopped-docker-compose-environment.d.ts +8 -0
  87. package/dist/src/docker-compose-environment/stopped-docker-compose-environment.js +27 -0
  88. package/dist/src/docker-image-name.d.ts +15 -0
  89. package/dist/src/docker-image-name.js +63 -0
  90. package/dist/src/dockerfile-parser.d.ts +3 -0
  91. package/dist/src/dockerfile-parser.js +39 -0
  92. package/dist/src/generic-container/generic-container-builder.d.ts +18 -0
  93. package/dist/src/generic-container/generic-container-builder.js +98 -0
  94. package/dist/src/generic-container/generic-container.d.ts +77 -0
  95. package/dist/src/generic-container/generic-container.js +312 -0
  96. package/dist/src/generic-container/started-generic-container.d.ts +31 -0
  97. package/dist/src/generic-container/started-generic-container.js +97 -0
  98. package/dist/src/generic-container/stopped-generic-container.d.ts +3 -0
  99. package/dist/src/generic-container/stopped-generic-container.js +6 -0
  100. package/dist/src/hash.d.ts +1 -0
  101. package/dist/src/hash.js +11 -0
  102. package/dist/src/http-wait-strategy.d.ts +27 -0
  103. package/dist/src/http-wait-strategy.js +113 -0
  104. package/dist/src/images.d.ts +2 -0
  105. package/dist/src/images.js +6 -0
  106. package/dist/src/index.d.ts +21 -0
  107. package/dist/src/index.js +54 -0
  108. package/dist/src/labels.d.ts +5 -0
  109. package/dist/src/labels.js +8 -0
  110. package/dist/src/logger.d.ts +36 -0
  111. package/dist/src/logger.js +61 -0
  112. package/dist/src/modules/abstract-started-container.d.ts +21 -0
  113. package/dist/src/modules/abstract-started-container.js +59 -0
  114. package/dist/src/modules/arangodb/arangodb-container.d.ts +19 -0
  115. package/dist/src/modules/arangodb/arangodb-container.js +60 -0
  116. package/dist/src/modules/elasticsearch/elasticsearch-container.d.ts +12 -0
  117. package/dist/src/modules/elasticsearch/elasticsearch-container.js +43 -0
  118. package/dist/src/modules/kafka/kafka-container.d.ts +46 -0
  119. package/dist/src/modules/kafka/kafka-container.js +172 -0
  120. package/dist/src/modules/mongodb/mongodb-container.d.ts +19 -0
  121. package/dist/src/modules/mongodb/mongodb-container.js +85 -0
  122. package/dist/src/modules/mysql/mysql-container.d.ts +29 -0
  123. package/dist/src/modules/mysql/mysql-container.js +102 -0
  124. package/dist/src/modules/nats/nats-container.d.ts +55 -0
  125. package/dist/src/modules/nats/nats-container.js +97 -0
  126. package/dist/src/modules/neo4j/neo4j-container.d.ts +23 -0
  127. package/dist/src/modules/neo4j/neo4j-container.js +82 -0
  128. package/dist/src/modules/postgresql/postgresql-container.d.ts +28 -0
  129. package/dist/src/modules/postgresql/postgresql-container.js +87 -0
  130. package/dist/src/network.d.ts +17 -0
  131. package/dist/src/network.js +54 -0
  132. package/dist/src/port-check.d.ts +17 -0
  133. package/dist/src/port-check.js +84 -0
  134. package/dist/src/port-forwarder.d.ts +17 -0
  135. package/dist/src/port-forwarder.js +81 -0
  136. package/dist/src/port-generator.d.ts +15 -0
  137. package/dist/src/port-generator.js +51 -0
  138. package/dist/src/port.d.ts +10 -0
  139. package/dist/src/port.js +47 -0
  140. package/dist/src/pull-policy.d.ts +9 -0
  141. package/dist/src/pull-policy.js +15 -0
  142. package/dist/src/reaper.d.ts +14 -0
  143. package/dist/src/reaper.js +141 -0
  144. package/dist/src/registry-auth-locator/auths.d.ts +8 -0
  145. package/dist/src/registry-auth-locator/auths.js +56 -0
  146. package/dist/src/registry-auth-locator/cred-helpers.d.ts +6 -0
  147. package/dist/src/registry-auth-locator/cred-helpers.js +15 -0
  148. package/dist/src/registry-auth-locator/credential-provider.d.ts +10 -0
  149. package/dist/src/registry-auth-locator/credential-provider.js +83 -0
  150. package/dist/src/registry-auth-locator/creds-store.d.ts +6 -0
  151. package/dist/src/registry-auth-locator/creds-store.js +15 -0
  152. package/dist/src/registry-auth-locator/get-auth-config.d.ts +2 -0
  153. package/dist/src/registry-auth-locator/get-auth-config.js +65 -0
  154. package/dist/src/registry-auth-locator/registry-auth-locator.d.ts +6 -0
  155. package/dist/src/registry-auth-locator/registry-auth-locator.js +2 -0
  156. package/dist/src/registry-auth-locator/registry-matches.d.ts +1 -0
  157. package/dist/src/registry-auth-locator/registry-matches.js +5 -0
  158. package/dist/src/registry-auth-locator/types.d.ts +23 -0
  159. package/dist/src/registry-auth-locator/types.js +2 -0
  160. package/dist/src/retry-strategy.d.ts +17 -0
  161. package/dist/src/retry-strategy.js +46 -0
  162. package/dist/src/startup-check-strategy.d.ts +7 -0
  163. package/dist/src/startup-check-strategy.js +30 -0
  164. package/dist/src/stream-utils.d.ts +6 -0
  165. package/dist/src/stream-utils.js +46 -0
  166. package/dist/src/system-info.d.ts +17 -0
  167. package/dist/src/system-info.js +51 -0
  168. package/dist/src/test-container.d.ts +66 -0
  169. package/dist/src/test-container.js +2 -0
  170. package/dist/src/test-containers.d.ts +3 -0
  171. package/dist/src/test-containers.js +22 -0
  172. package/dist/src/type-guards.d.ts +1 -0
  173. package/dist/src/type-guards.js +7 -0
  174. package/dist/src/uuid.d.ts +6 -0
  175. package/dist/src/uuid.js +13 -0
  176. package/dist/src/wait-for-container.d.ts +4 -0
  177. package/dist/src/wait-for-container.js +34 -0
  178. package/dist/src/wait-strategy.d.ts +32 -0
  179. package/dist/src/wait-strategy.js +137 -0
  180. package/dist/src/wait.d.ts +7 -0
  181. package/dist/src/wait.js +17 -0
  182. package/package.json +1 -1
@@ -0,0 +1,77 @@
1
+ import archiver from "archiver";
2
+ import { BoundPorts } from "../bound-ports";
3
+ import { PortWithOptionalBinding } from "../port";
4
+ import { PullPolicy } from "../pull-policy";
5
+ import { StartedTestContainer, TestContainer } from "../test-container";
6
+ import { WaitStrategy } from "../wait-strategy";
7
+ import { BindMount, ContentToCopy, Environment, ExtraHost, FileToCopy, HealthCheck, Labels, TmpFs, Ulimits, ResourcesQuota } from "../docker/types";
8
+ import { InspectResult } from "../docker/functions/container/inspect-container";
9
+ import { GenericContainerBuilder } from "./generic-container-builder";
10
+ import { StartedNetwork } from "../network";
11
+ export declare class GenericContainer implements TestContainer {
12
+ readonly image: string;
13
+ static fromDockerfile(context: string, dockerfileName?: string): GenericContainerBuilder;
14
+ private readonly imageName;
15
+ protected environment: Environment;
16
+ protected networkMode?: string;
17
+ protected networkAliases: string[];
18
+ protected ports: PortWithOptionalBinding[];
19
+ protected command: string[];
20
+ protected entrypoint?: string[];
21
+ protected bindMounts: BindMount[];
22
+ protected name?: string;
23
+ protected labels: Labels;
24
+ protected tmpFs: TmpFs;
25
+ protected healthCheck?: HealthCheck;
26
+ protected waitStrategy?: WaitStrategy;
27
+ protected startupTimeout: number;
28
+ protected useDefaultLogDriver: boolean;
29
+ protected privilegedMode: boolean;
30
+ protected workingDir?: string;
31
+ protected ipcMode?: string;
32
+ protected ulimits?: Ulimits;
33
+ protected addedCapabilities?: string[];
34
+ protected droppedCapabilities?: string[];
35
+ protected user?: string;
36
+ protected pullPolicy: PullPolicy;
37
+ protected reuse: boolean;
38
+ protected tarToCopy?: archiver.Archiver;
39
+ protected resourcesQuota?: ResourcesQuota;
40
+ private extraHosts;
41
+ constructor(image: string);
42
+ protected preStart?(): Promise<void>;
43
+ start(): Promise<StartedTestContainer>;
44
+ private reuseContainer;
45
+ private startContainer;
46
+ protected postStart?(container: StartedTestContainer, inspectResult: InspectResult, boundPorts: BoundPorts): Promise<void>;
47
+ protected get hasExposedPorts(): boolean;
48
+ withCommand(command: string[]): this;
49
+ withEntrypoint(entrypoint: string[]): this;
50
+ withName(name: string): this;
51
+ withLabels(labels: Labels): this;
52
+ withEnvironment(environment: Environment): this;
53
+ withTmpFs(tmpFs: TmpFs): this;
54
+ withUlimits(ulimits: Ulimits): this;
55
+ withAddedCapabilities(...capabilities: string[]): this;
56
+ withDroppedCapabilities(...capabilities: string[]): this;
57
+ withNetwork(network: StartedNetwork): this;
58
+ withNetworkMode(networkMode: string): this;
59
+ withNetworkAliases(...networkAliases: string[]): this;
60
+ withExtraHosts(extraHosts: ExtraHost[]): this;
61
+ withExposedPorts(...ports: PortWithOptionalBinding[]): this;
62
+ withBindMounts(bindMounts: BindMount[]): this;
63
+ withHealthCheck(healthCheck: HealthCheck): this;
64
+ withStartupTimeout(startupTimeoutMs: number): this;
65
+ withWaitStrategy(waitStrategy: WaitStrategy): this;
66
+ withDefaultLogDriver(): this;
67
+ withPrivilegedMode(): this;
68
+ withUser(user: string): this;
69
+ withReuse(): this;
70
+ withPullPolicy(pullPolicy: PullPolicy): this;
71
+ withIpcMode(ipcMode: string): this;
72
+ withCopyFilesToContainer(filesToCopy: FileToCopy[]): this;
73
+ withCopyContentToContainer(contentsToCopy: ContentToCopy[]): this;
74
+ protected getTarToCopy(): archiver.Archiver;
75
+ withWorkingDir(workingDir: string): this;
76
+ withResourcesQuota({ memory, cpu }: ResourcesQuota): this;
77
+ }
@@ -0,0 +1,312 @@
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.GenericContainer = void 0;
16
+ const archiver_1 = __importDefault(require("archiver"));
17
+ const async_lock_1 = __importDefault(require("async-lock"));
18
+ const bound_ports_1 = require("../bound-ports");
19
+ const logger_1 = require("../logger");
20
+ const pull_policy_1 = require("../pull-policy");
21
+ const reaper_1 = require("../reaper");
22
+ const docker_image_name_1 = require("../docker-image-name");
23
+ const wait_strategy_1 = require("../wait-strategy");
24
+ const port_forwarder_1 = require("../port-forwarder");
25
+ const pull_image_1 = require("../docker/functions/image/pull-image");
26
+ const create_container_1 = require("../docker/functions/container/create-container");
27
+ const connect_network_1 = require("../docker/functions/network/connect-network");
28
+ const docker_client_1 = require("../docker/docker-client");
29
+ const inspect_container_1 = require("../docker/functions/container/inspect-container");
30
+ const start_container_1 = require("../docker/functions/container/start-container");
31
+ const container_logs_1 = require("../docker/functions/container/container-logs");
32
+ const put_container_archive_1 = require("../docker/functions/container/put-container-archive");
33
+ const generic_container_builder_1 = require("./generic-container-builder");
34
+ const started_generic_container_1 = require("./started-generic-container");
35
+ const hash_1 = require("../hash");
36
+ const get_container_1 = require("../docker/functions/container/get-container");
37
+ const labels_1 = require("../labels");
38
+ const wait_for_container_1 = require("../wait-for-container");
39
+ const reusableContainerCreationLock = new async_lock_1.default();
40
+ class GenericContainer {
41
+ static fromDockerfile(context, dockerfileName = "Dockerfile") {
42
+ return new generic_container_builder_1.GenericContainerBuilder(context, dockerfileName);
43
+ }
44
+ constructor(image) {
45
+ this.image = image;
46
+ this.environment = {};
47
+ this.networkAliases = [];
48
+ this.ports = [];
49
+ this.command = [];
50
+ this.bindMounts = [];
51
+ this.labels = {};
52
+ this.tmpFs = {};
53
+ this.startupTimeout = 60000;
54
+ this.useDefaultLogDriver = false;
55
+ this.privilegedMode = false;
56
+ this.pullPolicy = new pull_policy_1.DefaultPullPolicy();
57
+ this.reuse = false;
58
+ this.extraHosts = [];
59
+ this.imageName = docker_image_name_1.DockerImageName.fromString(image);
60
+ }
61
+ start() {
62
+ return __awaiter(this, void 0, void 0, function* () {
63
+ const { dockerode, indexServerAddress } = yield (0, docker_client_1.dockerClient)();
64
+ yield (0, pull_image_1.pullImage)(dockerode, indexServerAddress, {
65
+ imageName: this.imageName,
66
+ force: this.pullPolicy.shouldPull(),
67
+ });
68
+ if (!this.reuse && !this.imageName.isReaper()) {
69
+ yield reaper_1.ReaperInstance.getInstance();
70
+ }
71
+ if (this.preStart) {
72
+ yield this.preStart();
73
+ }
74
+ if (!this.imageName.isHelperContainer() && port_forwarder_1.PortForwarderInstance.isRunning()) {
75
+ const portForwarder = yield port_forwarder_1.PortForwarderInstance.getInstance();
76
+ this.extraHosts.push({ host: "host.testcontainers.internal", ipAddress: portForwarder.getIpAddress() });
77
+ }
78
+ const createContainerOptions = {
79
+ imageName: this.imageName,
80
+ environment: this.environment,
81
+ command: this.command,
82
+ entrypoint: this.entrypoint,
83
+ bindMounts: this.bindMounts,
84
+ tmpFs: this.tmpFs,
85
+ exposedPorts: this.ports,
86
+ name: this.name,
87
+ labels: this.labels,
88
+ reusable: this.reuse,
89
+ networkMode: this.networkAliases.length > 0 ? undefined : this.networkMode,
90
+ healthCheck: this.healthCheck,
91
+ useDefaultLogDriver: this.useDefaultLogDriver,
92
+ privilegedMode: this.privilegedMode,
93
+ autoRemove: this.imageName.isReaper(),
94
+ extraHosts: this.extraHosts,
95
+ ipcMode: this.ipcMode,
96
+ ulimits: this.ulimits,
97
+ addedCapabilities: this.addedCapabilities,
98
+ droppedCapabilities: this.droppedCapabilities,
99
+ user: this.user,
100
+ workingDir: this.workingDir,
101
+ resourcesQuota: this.resourcesQuota,
102
+ };
103
+ if (this.reuse) {
104
+ const containerHash = (0, hash_1.hash)(JSON.stringify(createContainerOptions));
105
+ createContainerOptions.labels = Object.assign(Object.assign({}, createContainerOptions.labels), { [labels_1.LABEL_TESTCONTAINERS_CONTAINER_HASH]: containerHash });
106
+ logger_1.log.debug(`Container reuse has been enabled, hash: ${containerHash}`);
107
+ // We might have several async processes try to create a reusable container
108
+ // at once, to avoid possibly creating too many of these, use a lock
109
+ // on the containerHash, this ensures that only single reusable instance is created
110
+ return reusableContainerCreationLock.acquire(containerHash, () => __awaiter(this, void 0, void 0, function* () {
111
+ const container = yield (0, get_container_1.getContainerByHash)(containerHash);
112
+ if (container !== undefined) {
113
+ logger_1.log.debug(`Found container to reuse with hash: ${containerHash}`);
114
+ return this.reuseContainer(container);
115
+ }
116
+ else {
117
+ logger_1.log.debug("No container found to reuse");
118
+ return this.startContainer(createContainerOptions);
119
+ }
120
+ }));
121
+ }
122
+ else {
123
+ return this.startContainer(createContainerOptions);
124
+ }
125
+ });
126
+ }
127
+ reuseContainer(startedContainer) {
128
+ var _a;
129
+ return __awaiter(this, void 0, void 0, function* () {
130
+ const { host, hostIps } = yield (0, docker_client_1.dockerClient)();
131
+ const inspectResult = yield (0, inspect_container_1.inspectContainer)(startedContainer);
132
+ const boundPorts = bound_ports_1.BoundPorts.fromInspectResult(hostIps, inspectResult).filter(this.ports);
133
+ const waitStrategy = ((_a = this.waitStrategy) !== null && _a !== void 0 ? _a : (0, wait_strategy_1.defaultWaitStrategy)(host, startedContainer)).withStartupTimeout(this.startupTimeout);
134
+ yield (0, wait_for_container_1.waitForContainer)(startedContainer, waitStrategy, host, boundPorts);
135
+ return new started_generic_container_1.StartedGenericContainer(startedContainer, host, inspectResult, boundPorts, inspectResult.name, waitStrategy);
136
+ });
137
+ }
138
+ startContainer(createContainerOptions) {
139
+ var _a;
140
+ return __awaiter(this, void 0, void 0, function* () {
141
+ const container = yield (0, create_container_1.createContainer)(createContainerOptions);
142
+ if (!this.imageName.isHelperContainer() && port_forwarder_1.PortForwarderInstance.isRunning()) {
143
+ const portForwarder = yield port_forwarder_1.PortForwarderInstance.getInstance();
144
+ const portForwarderNetworkId = portForwarder.getNetworkId();
145
+ const excludedNetworks = [portForwarderNetworkId, "none", "host"];
146
+ if (!this.networkMode || !excludedNetworks.includes(this.networkMode)) {
147
+ yield (0, connect_network_1.connectNetwork)({
148
+ containerId: container.id,
149
+ networkId: portForwarderNetworkId,
150
+ networkAliases: [],
151
+ });
152
+ }
153
+ }
154
+ if (this.networkMode && this.networkAliases.length > 0) {
155
+ yield (0, connect_network_1.connectNetwork)({
156
+ containerId: container.id,
157
+ networkId: this.networkMode,
158
+ networkAliases: this.networkAliases,
159
+ });
160
+ }
161
+ if (this.tarToCopy) {
162
+ this.tarToCopy.finalize();
163
+ yield (0, put_container_archive_1.putContainerArchive)({ container, stream: this.tarToCopy, containerPath: "/" });
164
+ }
165
+ logger_1.log.info(`Starting container ${this.imageName} with ID: ${container.id}`);
166
+ yield (0, start_container_1.startContainer)(container);
167
+ const { host, hostIps } = yield (0, docker_client_1.dockerClient)();
168
+ const inspectResult = yield (0, inspect_container_1.inspectContainer)(container);
169
+ const boundPorts = bound_ports_1.BoundPorts.fromInspectResult(hostIps, inspectResult).filter(this.ports);
170
+ const waitStrategy = ((_a = this.waitStrategy) !== null && _a !== void 0 ? _a : (0, wait_strategy_1.defaultWaitStrategy)(host, container)).withStartupTimeout(this.startupTimeout);
171
+ (yield (0, container_logs_1.containerLogs)(container))
172
+ .on("data", (data) => logger_1.containerLog.trace(`${container.id}: ${data.trim()}`))
173
+ .on("err", (data) => logger_1.containerLog.error(`${container.id}: ${data.trim()}`));
174
+ yield (0, wait_for_container_1.waitForContainer)(container, waitStrategy, host, boundPorts);
175
+ const startedContainer = new started_generic_container_1.StartedGenericContainer(container, host, inspectResult, boundPorts, inspectResult.name, waitStrategy);
176
+ if (this.postStart) {
177
+ yield this.postStart(startedContainer, inspectResult, boundPorts);
178
+ }
179
+ return startedContainer;
180
+ });
181
+ }
182
+ get hasExposedPorts() {
183
+ return this.ports.length !== 0;
184
+ }
185
+ withCommand(command) {
186
+ this.command = command;
187
+ return this;
188
+ }
189
+ withEntrypoint(entrypoint) {
190
+ this.entrypoint = entrypoint;
191
+ return this;
192
+ }
193
+ withName(name) {
194
+ this.name = name;
195
+ return this;
196
+ }
197
+ withLabels(labels) {
198
+ this.labels = Object.assign(Object.assign({}, this.labels), labels);
199
+ return this;
200
+ }
201
+ withEnvironment(environment) {
202
+ this.environment = Object.assign(Object.assign({}, this.environment), environment);
203
+ return this;
204
+ }
205
+ withTmpFs(tmpFs) {
206
+ this.tmpFs = Object.assign(Object.assign({}, this.tmpFs), tmpFs);
207
+ return this;
208
+ }
209
+ withUlimits(ulimits) {
210
+ this.ulimits = Object.assign(Object.assign({}, this.ulimits), ulimits);
211
+ return this;
212
+ }
213
+ withAddedCapabilities(...capabilities) {
214
+ var _a;
215
+ this.addedCapabilities = [...((_a = this.addedCapabilities) !== null && _a !== void 0 ? _a : []), ...capabilities];
216
+ return this;
217
+ }
218
+ withDroppedCapabilities(...capabilities) {
219
+ var _a;
220
+ this.droppedCapabilities = [...((_a = this.droppedCapabilities) !== null && _a !== void 0 ? _a : []), ...capabilities];
221
+ return this;
222
+ }
223
+ withNetwork(network) {
224
+ this.networkMode = network.getName();
225
+ return this;
226
+ }
227
+ withNetworkMode(networkMode) {
228
+ this.networkMode = networkMode;
229
+ return this;
230
+ }
231
+ withNetworkAliases(...networkAliases) {
232
+ this.networkAliases = [...this.networkAliases, ...networkAliases];
233
+ return this;
234
+ }
235
+ withExtraHosts(extraHosts) {
236
+ this.extraHosts = [...this.extraHosts, ...extraHosts];
237
+ return this;
238
+ }
239
+ withExposedPorts(...ports) {
240
+ this.ports = [...this.ports, ...ports];
241
+ return this;
242
+ }
243
+ withBindMounts(bindMounts) {
244
+ this.bindMounts = bindMounts.map((bindMount) => (Object.assign({ mode: "rw" }, bindMount)));
245
+ return this;
246
+ }
247
+ withHealthCheck(healthCheck) {
248
+ this.healthCheck = healthCheck;
249
+ return this;
250
+ }
251
+ withStartupTimeout(startupTimeoutMs) {
252
+ this.startupTimeout = startupTimeoutMs;
253
+ return this;
254
+ }
255
+ withWaitStrategy(waitStrategy) {
256
+ this.waitStrategy = waitStrategy;
257
+ return this;
258
+ }
259
+ withDefaultLogDriver() {
260
+ this.useDefaultLogDriver = true;
261
+ return this;
262
+ }
263
+ withPrivilegedMode() {
264
+ this.privilegedMode = true;
265
+ return this;
266
+ }
267
+ withUser(user) {
268
+ this.user = user;
269
+ return this;
270
+ }
271
+ withReuse() {
272
+ this.reuse = true;
273
+ return this;
274
+ }
275
+ withPullPolicy(pullPolicy) {
276
+ this.pullPolicy = pullPolicy;
277
+ return this;
278
+ }
279
+ withIpcMode(ipcMode) {
280
+ this.ipcMode = ipcMode;
281
+ return this;
282
+ }
283
+ withCopyFilesToContainer(filesToCopy) {
284
+ const tar = this.getTarToCopy();
285
+ filesToCopy.forEach(({ source, target }) => tar.file(source, { name: target }));
286
+ return this;
287
+ }
288
+ withCopyContentToContainer(contentsToCopy) {
289
+ const tar = this.getTarToCopy();
290
+ contentsToCopy.forEach(({ content, target }) => tar.append(content, { name: target }));
291
+ return this;
292
+ }
293
+ getTarToCopy() {
294
+ if (!this.tarToCopy) {
295
+ this.tarToCopy = (0, archiver_1.default)("tar");
296
+ }
297
+ return this.tarToCopy;
298
+ }
299
+ withWorkingDir(workingDir) {
300
+ this.workingDir = workingDir;
301
+ return this;
302
+ }
303
+ withResourcesQuota({ memory, cpu }) {
304
+ // Memory and CPU units from here: https://docs.docker.com/engine/api/v1.42/#tag/Container/operation/ContainerCreate
305
+ // see Memory, NanoCpus parameters
306
+ const ram = memory !== undefined ? memory * Math.pow(1024, 3) : undefined;
307
+ const cpuQuota = cpu !== undefined ? cpu * Math.pow(10, 9) : undefined;
308
+ this.resourcesQuota = { memory: ram, cpu: cpuQuota };
309
+ return this;
310
+ }
311
+ }
312
+ exports.GenericContainer = GenericContainer;
@@ -0,0 +1,31 @@
1
+ /// <reference types="node" />
2
+ import { ExecOptions, RestartOptions, StartedTestContainer, StopOptions, StoppedTestContainer } from "../test-container";
3
+ import Dockerode from "dockerode";
4
+ import { ExecResult, Labels } from "../docker/types";
5
+ import { InspectResult } from "../docker/functions/container/inspect-container";
6
+ import { BoundPorts } from "../bound-ports";
7
+ import { Readable } from "stream";
8
+ import { WaitStrategy } from "../wait-strategy";
9
+ export declare class StartedGenericContainer implements StartedTestContainer {
10
+ private readonly container;
11
+ private readonly host;
12
+ private inspectResult;
13
+ private boundPorts;
14
+ private readonly name;
15
+ private readonly waitStrategy;
16
+ constructor(container: Dockerode.Container, host: string, inspectResult: InspectResult, boundPorts: BoundPorts, name: string, waitStrategy: WaitStrategy);
17
+ stop(options?: Partial<StopOptions>): Promise<StoppedTestContainer>;
18
+ restart(options?: Partial<RestartOptions>): Promise<void>;
19
+ private stopContainer;
20
+ getHost(): string;
21
+ getFirstMappedPort(): number;
22
+ getMappedPort(port: number): number;
23
+ getId(): string;
24
+ getName(): string;
25
+ getLabels(): Labels;
26
+ getNetworkNames(): string[];
27
+ getNetworkId(networkName: string): string;
28
+ getIpAddress(networkName: string): string;
29
+ exec(command: string[], options?: Partial<ExecOptions>): Promise<ExecResult>;
30
+ logs(): Promise<Readable>;
31
+ }
@@ -0,0 +1,97 @@
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.StartedGenericContainer = void 0;
13
+ const inspect_container_1 = require("../docker/functions/container/inspect-container");
14
+ const bound_ports_1 = require("../bound-ports");
15
+ const logger_1 = require("../logger");
16
+ const remove_container_1 = require("../docker/functions/container/remove-container");
17
+ const exec_container_1 = require("../docker/functions/container/exec-container");
18
+ const container_logs_1 = require("../docker/functions/container/container-logs");
19
+ const stopped_generic_container_1 = require("./stopped-generic-container");
20
+ const stop_container_1 = require("../docker/functions/container/stop-container");
21
+ const restart_container_1 = require("../docker/functions/container/restart-container");
22
+ const wait_for_container_1 = require("../wait-for-container");
23
+ const docker_client_1 = require("../docker/docker-client");
24
+ class StartedGenericContainer {
25
+ constructor(container, host, inspectResult, boundPorts, name, waitStrategy) {
26
+ this.container = container;
27
+ this.host = host;
28
+ this.inspectResult = inspectResult;
29
+ this.boundPorts = boundPorts;
30
+ this.name = name;
31
+ this.waitStrategy = waitStrategy;
32
+ }
33
+ stop(options = {}) {
34
+ return __awaiter(this, void 0, void 0, function* () {
35
+ return this.stopContainer(options);
36
+ });
37
+ }
38
+ restart(options = {}) {
39
+ return __awaiter(this, void 0, void 0, function* () {
40
+ const resolvedOptions = Object.assign({ timeout: 0 }, options);
41
+ logger_1.log.info(`Restarting container with ID: ${this.container.id}`);
42
+ yield (0, restart_container_1.restartContainer)(this.container, resolvedOptions);
43
+ const { hostIps } = yield (0, docker_client_1.dockerClient)();
44
+ this.inspectResult = yield (0, inspect_container_1.inspectContainer)(this.container);
45
+ const startTime = this.inspectResult.state.startedAt;
46
+ (yield (0, container_logs_1.containerLogs)(this.container, { since: startTime }))
47
+ .on("data", (data) => logger_1.containerLog.trace(`${this.container.id}: ${data.trim()}`))
48
+ .on("err", (data) => logger_1.containerLog.error(`${this.container.id}: ${data.trim()}`));
49
+ this.boundPorts = bound_ports_1.BoundPorts.fromInspectResult(hostIps, this.inspectResult).filter(Array.from(this.boundPorts.iterator()).map((port) => port[0]));
50
+ yield (0, wait_for_container_1.waitForContainer)(this.container, this.waitStrategy, this.host, this.boundPorts, startTime);
51
+ });
52
+ }
53
+ stopContainer(options = {}) {
54
+ return __awaiter(this, void 0, void 0, function* () {
55
+ logger_1.log.info(`Stopping container with ID: ${this.container.id}`);
56
+ const resolvedOptions = Object.assign({ timeout: 0, removeVolumes: true }, options);
57
+ yield (0, stop_container_1.stopContainer)(this.container, { timeout: resolvedOptions.timeout });
58
+ yield (0, remove_container_1.removeContainer)(this.container, { removeVolumes: resolvedOptions.removeVolumes });
59
+ return new stopped_generic_container_1.StoppedGenericContainer();
60
+ });
61
+ }
62
+ getHost() {
63
+ return this.host;
64
+ }
65
+ getFirstMappedPort() {
66
+ return this.boundPorts.getFirstBinding();
67
+ }
68
+ getMappedPort(port) {
69
+ return this.boundPorts.getBinding(port);
70
+ }
71
+ getId() {
72
+ return this.container.id;
73
+ }
74
+ getName() {
75
+ return this.name;
76
+ }
77
+ getLabels() {
78
+ return this.inspectResult.labels;
79
+ }
80
+ getNetworkNames() {
81
+ return Object.keys(this.inspectResult.networkSettings);
82
+ }
83
+ getNetworkId(networkName) {
84
+ return this.inspectResult.networkSettings[networkName].networkId;
85
+ }
86
+ getIpAddress(networkName) {
87
+ return this.inspectResult.networkSettings[networkName].ipAddress;
88
+ }
89
+ exec(command, options = {}) {
90
+ const resolvedOptions = Object.assign({ stdin: true, detach: false, tty: true }, options);
91
+ return (0, exec_container_1.execContainer)(this.container, command, resolvedOptions);
92
+ }
93
+ logs() {
94
+ return (0, container_logs_1.containerLogs)(this.container);
95
+ }
96
+ }
97
+ exports.StartedGenericContainer = StartedGenericContainer;
@@ -0,0 +1,3 @@
1
+ import { StoppedTestContainer } from "../test-container";
2
+ export declare class StoppedGenericContainer implements StoppedTestContainer {
3
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StoppedGenericContainer = void 0;
4
+ class StoppedGenericContainer {
5
+ }
6
+ exports.StoppedGenericContainer = StoppedGenericContainer;
@@ -0,0 +1 @@
1
+ export declare const hash: (str: string) => string;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.hash = void 0;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ const hash = (str) => {
9
+ return crypto_1.default.createHash("md5").update(str).digest("hex");
10
+ };
11
+ exports.hash = hash;
@@ -0,0 +1,27 @@
1
+ import Dockerode from "dockerode";
2
+ import { BoundPorts } from "./bound-ports";
3
+ import { AbstractWaitStrategy } from "./wait-strategy";
4
+ export declare class HttpWaitStrategy extends AbstractWaitStrategy {
5
+ private readonly path;
6
+ private readonly port;
7
+ private protocol;
8
+ private method;
9
+ private headers;
10
+ private predicates;
11
+ private _allowInsecure;
12
+ private readTimeout;
13
+ constructor(path: string, port: number);
14
+ forStatusCode(statusCode: number): HttpWaitStrategy;
15
+ forStatusCodeMatching(predicate: (statusCode: number) => boolean): HttpWaitStrategy;
16
+ forResponsePredicate(predicate: (response: string) => boolean): HttpWaitStrategy;
17
+ withMethod(method: string): HttpWaitStrategy;
18
+ withHeaders(headers: {
19
+ [key: string]: string;
20
+ }): HttpWaitStrategy;
21
+ withBasicCredentials(username: string, password: string): HttpWaitStrategy;
22
+ withReadTimeout(readTimeout: number): HttpWaitStrategy;
23
+ usingTls(): HttpWaitStrategy;
24
+ allowInsecure(): HttpWaitStrategy;
25
+ waitUntilReady(container: Dockerode.Container, host: string, boundPorts: BoundPorts): Promise<void>;
26
+ private getAgent;
27
+ }