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,34 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.listImages = void 0;
13
+ const docker_image_name_1 = require("../../../docker-image-name");
14
+ const logger_1 = require("../../../logger");
15
+ const listImages = (dockerode) => __awaiter(void 0, void 0, void 0, function* () {
16
+ try {
17
+ const images = yield dockerode.listImages();
18
+ return images.reduce((dockerImageNames, image) => {
19
+ var _a;
20
+ if (isDanglingImage(image)) {
21
+ return dockerImageNames;
22
+ }
23
+ const repoTags = (_a = image.RepoTags) !== null && _a !== void 0 ? _a : [];
24
+ const dockerImageNamesForImage = repoTags.map((imageRepoTag) => docker_image_name_1.DockerImageName.fromString(imageRepoTag));
25
+ return [...dockerImageNames, ...dockerImageNamesForImage];
26
+ }, []);
27
+ }
28
+ catch (err) {
29
+ logger_1.log.error(`Failed to list images: ${err}`);
30
+ throw err;
31
+ }
32
+ });
33
+ exports.listImages = listImages;
34
+ const isDanglingImage = (image) => image.RepoTags === null;
@@ -0,0 +1,7 @@
1
+ import { DockerImageName } from "../../../docker-image-name";
2
+ import Dockerode from "dockerode";
3
+ export type PullImageOptions = {
4
+ imageName: DockerImageName;
5
+ force: boolean;
6
+ };
7
+ export declare const pullImage: (dockerode: Dockerode, indexServerAddress: string, options: PullImageOptions) => Promise<void>;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ 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.pullImage = void 0;
16
+ const logger_1 = require("../../../logger");
17
+ const pull_stream_parser_1 = require("../../pull-stream-parser");
18
+ const image_exists_1 = require("./image-exists");
19
+ const get_auth_config_1 = require("../../../registry-auth-locator/get-auth-config");
20
+ const async_lock_1 = __importDefault(require("async-lock"));
21
+ const imagePullLock = new async_lock_1.default();
22
+ const pullImage = (dockerode, indexServerAddress, options) => __awaiter(void 0, void 0, void 0, function* () {
23
+ try {
24
+ return imagePullLock.acquire(options.imageName.toString(), () => __awaiter(void 0, void 0, void 0, function* () {
25
+ var _a;
26
+ if (!options.force && (yield (0, image_exists_1.imageExists)(dockerode, options.imageName))) {
27
+ logger_1.log.debug(`Not pulling image as it already exists: ${options.imageName}`);
28
+ return;
29
+ }
30
+ logger_1.log.info(`Pulling image: ${options.imageName}`);
31
+ const authconfig = yield (0, get_auth_config_1.getAuthConfig)((_a = options.imageName.registry) !== null && _a !== void 0 ? _a : indexServerAddress);
32
+ const stream = yield dockerode.pull(options.imageName.toString(), { authconfig });
33
+ yield new pull_stream_parser_1.PullStreamParser(options.imageName, logger_1.log).consume(stream);
34
+ }));
35
+ }
36
+ catch (err) {
37
+ logger_1.log.error(`Failed to pull image "${options.imageName}": ${err}`);
38
+ throw err;
39
+ }
40
+ });
41
+ exports.pullImage = pullImage;
@@ -0,0 +1,6 @@
1
+ export type ConnectNetworkOptions = {
2
+ containerId: string;
3
+ networkId: string;
4
+ networkAliases: string[];
5
+ };
6
+ export declare const connectNetwork: (options: ConnectNetworkOptions) => Promise<void>;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.connectNetwork = void 0;
13
+ const logger_1 = require("../../../logger");
14
+ const docker_client_1 = require("../../docker-client");
15
+ const connectNetwork = (options) => __awaiter(void 0, void 0, void 0, function* () {
16
+ try {
17
+ logger_1.log.info(`Connecting container ${options.containerId} to network ${options.networkId}`);
18
+ const { dockerode } = yield (0, docker_client_1.dockerClient)();
19
+ const network = dockerode.getNetwork(options.networkId);
20
+ yield network.connect({ Container: options.containerId, EndpointConfig: { Aliases: options.networkAliases } });
21
+ }
22
+ catch (err) {
23
+ logger_1.log.error(`Failed to connect container ${options.containerId} to network ${options.networkId}: ${err}`);
24
+ throw err;
25
+ }
26
+ });
27
+ exports.connectNetwork = connectNetwork;
@@ -0,0 +1,16 @@
1
+ export type CreateNetworkOptions = {
2
+ name: string;
3
+ driver: "bridge" | "overlay" | string;
4
+ checkDuplicate: boolean;
5
+ internal: boolean;
6
+ attachable: boolean;
7
+ ingress: boolean;
8
+ enableIPv6: boolean;
9
+ labels?: {
10
+ [key: string]: string;
11
+ };
12
+ options?: {
13
+ [key: string]: string;
14
+ };
15
+ };
16
+ export declare const createNetwork: (options: CreateNetworkOptions) => Promise<string>;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createNetwork = void 0;
13
+ const logger_1 = require("../../../logger");
14
+ const docker_client_1 = require("../../docker-client");
15
+ const create_labels_1 = require("../create-labels");
16
+ const createNetwork = (options) => __awaiter(void 0, void 0, void 0, function* () {
17
+ try {
18
+ logger_1.log.info(`Creating network ${options.name}`);
19
+ const { dockerode } = yield (0, docker_client_1.dockerClient)();
20
+ const network = yield dockerode.createNetwork({
21
+ Name: options.name,
22
+ CheckDuplicate: options.checkDuplicate,
23
+ Driver: options.driver,
24
+ Internal: options.internal,
25
+ Attachable: options.attachable,
26
+ Ingress: options.ingress,
27
+ EnableIPv6: options.enableIPv6,
28
+ Options: options.options,
29
+ Labels: Object.assign(Object.assign({}, options.labels), (0, create_labels_1.createLabels)(false)),
30
+ });
31
+ return network.id;
32
+ }
33
+ catch (err) {
34
+ logger_1.log.error(`Failed to create network: ${err}`);
35
+ throw err;
36
+ }
37
+ });
38
+ exports.createNetwork = createNetwork;
@@ -0,0 +1 @@
1
+ export declare const removeNetwork: (id: string) => Promise<void>;
@@ -0,0 +1,30 @@
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.removeNetwork = void 0;
13
+ const logger_1 = require("../../../logger");
14
+ const docker_client_1 = require("../../docker-client");
15
+ const removeNetwork = (id) => __awaiter(void 0, void 0, void 0, function* () {
16
+ try {
17
+ logger_1.log.info(`Removing network ${id}`);
18
+ const { dockerode } = yield (0, docker_client_1.dockerClient)();
19
+ const network = dockerode.getNetwork(id);
20
+ const { message } = yield network.remove();
21
+ if (message) {
22
+ logger_1.log.warn(message);
23
+ }
24
+ }
25
+ catch (err) {
26
+ logger_1.log.error(`Failed to remove network ${id}: ${err}`);
27
+ throw err;
28
+ }
29
+ });
30
+ exports.removeNetwork = removeNetwork;
@@ -0,0 +1,2 @@
1
+ import Dockerode from "dockerode";
2
+ export declare const runInContainer: (dockerode: Dockerode, indexServerAddress: string, image: string, command: string[]) => Promise<string | undefined>;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.runInContainer = void 0;
13
+ const logger_1 = require("../../logger");
14
+ const docker_image_name_1 = require("../../docker-image-name");
15
+ const pull_image_1 = require("./image/pull-image");
16
+ const start_container_1 = require("./container/start-container");
17
+ const attach_container_1 = require("./container/attach-container");
18
+ const stream_utils_1 = require("../../stream-utils");
19
+ const runInContainer = (dockerode, indexServerAddress, image, command) => __awaiter(void 0, void 0, void 0, function* () {
20
+ try {
21
+ yield (0, pull_image_1.pullImage)(dockerode, indexServerAddress, { imageName: docker_image_name_1.DockerImageName.fromString(image), force: false });
22
+ logger_1.log.debug(`Creating container: ${image} with command: ${command.join(" ")}`);
23
+ const container = yield dockerode.createContainer({ Image: image, Cmd: command });
24
+ logger_1.log.debug(`Attaching to container: ${container.id}`);
25
+ const stream = yield (0, attach_container_1.attachContainer)(dockerode, container);
26
+ logger_1.log.debug(`Starting container: ${container.id}`);
27
+ yield (0, start_container_1.startContainer)(container);
28
+ logger_1.log.debug(`Waiting for container output: ${container.id}`);
29
+ const output = yield (0, stream_utils_1.streamToString)(stream, { trim: true });
30
+ logger_1.log.debug(`Removing container: ${container.id}`);
31
+ yield container.remove({ force: true, v: true });
32
+ return output.length === 0 ? undefined : output;
33
+ }
34
+ catch (err) {
35
+ logger_1.log.error(`Failed to run command in container: "${command.join(" ")}", error: "${err}"`);
36
+ return undefined;
37
+ }
38
+ });
39
+ exports.runInContainer = runInContainer;
@@ -0,0 +1,5 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ /// <reference types="node" />
4
+ /// <reference types="node" />
5
+ export declare const getRemoteDockerUnixSocketPath: (uri: string, platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv) => string;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRemoteDockerUnixSocketPath = void 0;
4
+ const getRemoteDockerUnixSocketPath = (uri, platform = process.platform, env = process.env) => {
5
+ if (env["TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE"] !== undefined) {
6
+ return env["TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE"];
7
+ }
8
+ let socketPath;
9
+ if (uri.startsWith("unix://")) {
10
+ socketPath = uri.replace("unix://", "");
11
+ }
12
+ else {
13
+ socketPath = "/var/run/docker.sock";
14
+ }
15
+ return platform === "win32" ? `/${socketPath}` : socketPath;
16
+ };
17
+ exports.getRemoteDockerUnixSocketPath = getRemoteDockerUnixSocketPath;
@@ -0,0 +1,5 @@
1
+ export type HostIps = Array<{
2
+ address: string;
3
+ family: number;
4
+ }>;
5
+ export declare const lookupHostIps: (host: string) => Promise<HostIps>;
@@ -0,0 +1,26 @@
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.lookupHostIps = void 0;
16
+ const net_1 = __importDefault(require("net"));
17
+ const dns_1 = __importDefault(require("dns"));
18
+ const lookupHostIps = (host) => __awaiter(void 0, void 0, void 0, function* () {
19
+ if (net_1.default.isIP(host) === 0) {
20
+ return yield dns_1.default.promises.lookup(host, { all: true });
21
+ }
22
+ else {
23
+ return [{ address: host, family: net_1.default.isIP(host) }];
24
+ }
25
+ });
26
+ exports.lookupHostIps = lookupHostIps;
@@ -0,0 +1,11 @@
1
+ /// <reference types="node" />
2
+ import { Readable } from "stream";
3
+ import { Logger } from "../logger";
4
+ import { DockerImageName } from "../docker-image-name";
5
+ export declare class PullStreamParser {
6
+ private readonly dockerImageName;
7
+ private readonly logger;
8
+ constructor(dockerImageName: DockerImageName, logger: Logger);
9
+ consume(stream: Readable): Promise<void>;
10
+ private getOrElse;
11
+ }
@@ -0,0 +1,63 @@
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.PullStreamParser = void 0;
7
+ const byline_1 = __importDefault(require("byline"));
8
+ class PullStreamParser {
9
+ constructor(dockerImageName, logger) {
10
+ this.dockerImageName = dockerImageName;
11
+ this.logger = logger;
12
+ }
13
+ consume(stream) {
14
+ const messagesById = new Map();
15
+ const statusesById = new Map();
16
+ return new Promise((resolve) => {
17
+ (0, byline_1.default)(stream).on("data", (line) => {
18
+ try {
19
+ const json = JSON.parse(line);
20
+ const { id, status } = json;
21
+ const prefix = id
22
+ ? `Pulling ${this.dockerImageName.toString()} - ${id}`
23
+ : `Pulling ${this.dockerImageName.toString()}`;
24
+ if (status === "Downloading") {
25
+ const { current, total } = json.progressDetail;
26
+ const percentage = Math.round(100 * (current / total));
27
+ const message = `${prefix} - ${json.status} ${percentage}%`;
28
+ const messages = this.getOrElse(messagesById, id, new Set());
29
+ if (!messages.has(message)) {
30
+ messages.add(message);
31
+ this.logger.trace(message);
32
+ }
33
+ }
34
+ else {
35
+ const statuses = this.getOrElse(statusesById, id, new Set());
36
+ if (!statuses.has(status)) {
37
+ statuses.add(status);
38
+ const message = `${prefix} - ${json.status}`;
39
+ const messages = this.getOrElse(messagesById, id, new Set());
40
+ if (!messages.has(message)) {
41
+ messages.add(message);
42
+ this.logger.trace(message);
43
+ }
44
+ }
45
+ }
46
+ }
47
+ catch (_a) {
48
+ this.logger.warn(`Unexpected message format: ${line}`);
49
+ }
50
+ });
51
+ stream.on("end", resolve);
52
+ });
53
+ }
54
+ getOrElse(map, key, orElse) {
55
+ const value = map.get(key);
56
+ if (value === undefined) {
57
+ map.set(key, orElse);
58
+ return orElse;
59
+ }
60
+ return value;
61
+ }
62
+ }
63
+ exports.PullStreamParser = PullStreamParser;
@@ -0,0 +1,16 @@
1
+ /// <reference types="node" />
2
+ import { DockerClientInit, DockerClientStrategy } from "./docker-client";
3
+ export declare class RootlessUnixSocketStrategy implements DockerClientStrategy {
4
+ private readonly platform;
5
+ private readonly env;
6
+ private applicable;
7
+ private socketPath;
8
+ constructor(platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv);
9
+ init(): Promise<void>;
10
+ private getSocketPathFromEnv;
11
+ private getSocketPathFromHomeDir;
12
+ private getSocketPathFromRunDir;
13
+ getDockerClient(): Promise<DockerClientInit>;
14
+ isApplicable(): boolean;
15
+ getName(): string;
16
+ }
@@ -0,0 +1,69 @@
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.RootlessUnixSocketStrategy = void 0;
16
+ const type_guards_1 = require("../type-guards");
17
+ const fs_1 = require("fs");
18
+ const path_1 = __importDefault(require("path"));
19
+ const os_1 = __importDefault(require("os"));
20
+ const dockerode_1 = __importDefault(require("dockerode"));
21
+ class RootlessUnixSocketStrategy {
22
+ constructor(platform = process.platform, env = process.env) {
23
+ this.platform = platform;
24
+ this.env = env;
25
+ }
26
+ init() {
27
+ return __awaiter(this, void 0, void 0, function* () {
28
+ if (this.platform !== "linux" && this.platform !== "darwin") {
29
+ this.applicable = false;
30
+ return;
31
+ }
32
+ this.socketPath = [this.getSocketPathFromEnv(), this.getSocketPathFromHomeDir(), this.getSocketPathFromRunDir()]
33
+ .filter(type_guards_1.isDefined)
34
+ .find((candidateSocketPath) => (0, fs_1.existsSync)(candidateSocketPath));
35
+ this.applicable = this.socketPath !== undefined;
36
+ });
37
+ }
38
+ getSocketPathFromEnv() {
39
+ const xdgRuntimeDir = this.env["XDG_RUNTIME_DIR"];
40
+ if (xdgRuntimeDir !== undefined) {
41
+ return path_1.default.join(xdgRuntimeDir, "docker.sock");
42
+ }
43
+ else {
44
+ return undefined;
45
+ }
46
+ }
47
+ getSocketPathFromHomeDir() {
48
+ return path_1.default.join(os_1.default.homedir(), ".docker", "run", "docker.sock");
49
+ }
50
+ getSocketPathFromRunDir() {
51
+ return path_1.default.join("/run", "user", `${os_1.default.userInfo().uid}`, "docker.sock");
52
+ }
53
+ getDockerClient() {
54
+ return __awaiter(this, void 0, void 0, function* () {
55
+ return {
56
+ uri: `unix://${this.socketPath}`,
57
+ dockerode: new dockerode_1.default({ socketPath: this.socketPath }),
58
+ composeEnvironment: {},
59
+ };
60
+ });
61
+ }
62
+ isApplicable() {
63
+ return this.applicable;
64
+ }
65
+ getName() {
66
+ return "RootlessUnixSocketStrategy";
67
+ }
68
+ }
69
+ exports.RootlessUnixSocketStrategy = RootlessUnixSocketStrategy;
@@ -0,0 +1 @@
1
+ export declare const sessionId: string;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sessionId = void 0;
4
+ const uuid_1 = require("../uuid");
5
+ exports.sessionId = new uuid_1.RandomUuid().nextUuid();
@@ -0,0 +1,79 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { Readable } from "stream";
4
+ export type Environment = {
5
+ [key in string]: string;
6
+ };
7
+ export type BindMode = "rw" | "ro" | "z" | "Z";
8
+ export type BindMount = {
9
+ source: string;
10
+ target: string;
11
+ mode?: BindMode;
12
+ };
13
+ export type FileToCopy = {
14
+ source: string;
15
+ target: string;
16
+ };
17
+ export type Content = string | Buffer | Readable;
18
+ export type ContentToCopy = {
19
+ content: Content;
20
+ target: string;
21
+ };
22
+ export type TmpFs = {
23
+ [dir in string]: string;
24
+ };
25
+ export type Ulimits = {
26
+ [name: string]: {
27
+ hard: number | undefined;
28
+ soft: number | undefined;
29
+ };
30
+ };
31
+ export type ResourcesQuota = {
32
+ memory?: number;
33
+ cpu?: number;
34
+ };
35
+ export type HealthCheck = {
36
+ test: ["CMD-SHELL", string] | ["CMD", ...string[]];
37
+ interval?: number;
38
+ timeout?: number;
39
+ retries?: number;
40
+ startPeriod?: number;
41
+ };
42
+ export type ExtraHost = {
43
+ host: string;
44
+ ipAddress: string;
45
+ };
46
+ export type Labels = {
47
+ [key: string]: string;
48
+ };
49
+ export type HostPortBindings = Array<{
50
+ hostIp: string;
51
+ hostPort: number;
52
+ }>;
53
+ export type Ports = {
54
+ [containerPort: number]: HostPortBindings;
55
+ };
56
+ export type AuthConfig = {
57
+ username: string;
58
+ password: string;
59
+ registryAddress: string;
60
+ email?: string;
61
+ };
62
+ export type RegistryConfig = {
63
+ [registryAddress: string]: {
64
+ username: string;
65
+ password: string;
66
+ };
67
+ };
68
+ export type BuildArgs = {
69
+ [key in string]: string;
70
+ };
71
+ export type ExecResult = {
72
+ output: string;
73
+ exitCode: number;
74
+ };
75
+ export type HealthCheckStatus = "none" | "starting" | "unhealthy" | "healthy";
76
+ export type NetworkSettings = {
77
+ networkId: string;
78
+ ipAddress: string;
79
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ import { IDockerComposeOptions } from "docker-compose";
2
+ import { DockerComposeOptions } from "./docker-compose-options";
3
+ export declare const defaultDockerComposeOptions: ({ environment, ...options }: DockerComposeOptions) => Promise<Partial<IDockerComposeOptions>>;
@@ -0,0 +1,37 @@
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 __rest = (this && this.__rest) || function (s, e) {
12
+ var t = {};
13
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
+ t[p] = s[p];
15
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
+ t[p[i]] = s[p[i]];
19
+ }
20
+ return t;
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.defaultDockerComposeOptions = void 0;
24
+ const docker_client_1 = require("../docker/docker-client");
25
+ const defaultDockerComposeOptions = (_a) => __awaiter(void 0, void 0, void 0, function* () {
26
+ var { environment = {} } = _a, options = __rest(_a, ["environment"]);
27
+ const { composeEnvironment } = yield (0, docker_client_1.dockerClient)();
28
+ return {
29
+ log: false,
30
+ cwd: options.filePath,
31
+ config: options.files,
32
+ composeOptions: options.composeOptions,
33
+ commandOptions: options.commandOptions,
34
+ env: Object.assign(Object.assign(Object.assign(Object.assign({}, process.env), { COMPOSE_PROJECT_NAME: options.projectName }), composeEnvironment), environment),
35
+ };
36
+ });
37
+ exports.defaultDockerComposeOptions = defaultDockerComposeOptions;
@@ -0,0 +1,9 @@
1
+ import { Environment } from "../docker/types";
2
+ export type DockerComposeOptions = {
3
+ filePath: string;
4
+ files: string | string[];
5
+ projectName: string;
6
+ commandOptions?: string[];
7
+ composeOptions?: string[];
8
+ environment?: Environment;
9
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1 @@
1
+ export declare const resolveContainerName: (projectName: string, containerName: string) => string;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveContainerName = void 0;
4
+ const resolveContainerName = (projectName, containerName) => {
5
+ if (containerName.includes(projectName)) {
6
+ return containerName.substring(`/${projectName}_`.length);
7
+ }
8
+ else if (containerName.startsWith("/")) {
9
+ return containerName.substring(1);
10
+ }
11
+ else {
12
+ throw new Error(`Unable to resolve container name for container name: "${containerName}", project name: "${projectName}"`);
13
+ }
14
+ };
15
+ exports.resolveContainerName = resolveContainerName;