testcontainers 9.6.0 → 9.8.0-beta.1

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 (85) hide show
  1. package/dist/package.json +12 -12
  2. package/dist/src/docker/{docker-client-config.d.ts → client/docker-client-config.d.ts} +1 -0
  3. package/dist/src/docker/client/docker-client-config.js +79 -0
  4. package/dist/src/docker/client/docker-client.d.ts +18 -0
  5. package/dist/src/docker/client/docker-client.js +90 -0
  6. package/dist/src/docker/client/strategy/configuration-strategy.d.ts +11 -0
  7. package/dist/src/docker/client/strategy/configuration-strategy.js +68 -0
  8. package/dist/src/docker/client/strategy/docker-client-strategy.d.ts +7 -0
  9. package/dist/src/docker/client/strategy/docker-client-strategy.js +2 -0
  10. package/dist/src/docker/client/strategy/npipe-socket-strategy.d.ts +7 -0
  11. package/dist/src/docker/client/strategy/npipe-socket-strategy.js +35 -0
  12. package/dist/src/docker/{rootless-unix-socket-strategy.d.ts → client/strategy/rootless-unix-socket-strategy.d.ts} +3 -2
  13. package/dist/src/docker/{rootless-unix-socket-strategy.js → client/strategy/rootless-unix-socket-strategy.js} +2 -1
  14. package/dist/src/docker/client/strategy/testcontainers-host-strategy.d.ts +9 -0
  15. package/dist/src/docker/client/strategy/testcontainers-host-strategy.js +52 -0
  16. package/dist/src/docker/client/strategy/unix-socket-strategy.d.ts +7 -0
  17. package/dist/src/docker/client/strategy/unix-socket-strategy.js +36 -0
  18. package/dist/src/docker/functions/container/attach-container.js +1 -1
  19. package/dist/src/docker/functions/container/container-logs.js +2 -2
  20. package/dist/src/docker/functions/container/create-container.js +8 -6
  21. package/dist/src/docker/functions/container/exec-container.d.ts +2 -3
  22. package/dist/src/docker/functions/container/exec-container.js +9 -7
  23. package/dist/src/docker/functions/container/get-container.js +4 -4
  24. package/dist/src/docker/functions/container/inspect-container.js +1 -1
  25. package/dist/src/docker/functions/container/list-containers.js +2 -2
  26. package/dist/src/docker/functions/container/put-container-archive.js +1 -1
  27. package/dist/src/docker/functions/container/remove-container.js +1 -1
  28. package/dist/src/docker/functions/container/restart-container.js +1 -1
  29. package/dist/src/docker/functions/container/start-container.js +1 -1
  30. package/dist/src/docker/functions/container/stop-container.js +2 -2
  31. package/dist/src/docker/functions/create-labels.js +0 -3
  32. package/dist/src/docker/functions/image/build-image.js +10 -5
  33. package/dist/src/docker/functions/image/pull-image.js +11 -4
  34. package/dist/src/docker/functions/network/connect-network.js +5 -4
  35. package/dist/src/docker/functions/network/create-network.js +4 -3
  36. package/dist/src/docker/functions/network/remove-network.js +5 -4
  37. package/dist/src/docker/functions/run-in-container.js +6 -6
  38. package/dist/src/docker/remote-docker-unix-socket-path.d.ts +6 -0
  39. package/dist/src/docker/remote-docker-unix-socket-path.js +22 -0
  40. package/dist/src/docker/resolve-host.d.ts +2 -2
  41. package/dist/src/docker/resolve-host.js +8 -6
  42. package/dist/src/docker/types.d.ts +1 -0
  43. package/dist/src/docker-compose/default-docker-compose-options.js +6 -4
  44. package/dist/src/docker-compose/docker-compose-options.d.ts +2 -0
  45. package/dist/src/docker-compose/functions/docker-compose-down.js +1 -1
  46. package/dist/src/docker-compose/functions/docker-compose-pull.js +4 -4
  47. package/dist/src/docker-compose/functions/docker-compose-stop.js +1 -1
  48. package/dist/src/docker-compose/functions/docker-compose-up.js +1 -1
  49. package/dist/src/docker-compose-environment/docker-compose-environment.js +5 -8
  50. package/dist/src/generic-container/generic-container-builder.js +4 -4
  51. package/dist/src/generic-container/generic-container.d.ts +4 -0
  52. package/dist/src/generic-container/generic-container.js +23 -12
  53. package/dist/src/generic-container/started-generic-container.js +13 -8
  54. package/dist/src/images.js +1 -1
  55. package/dist/src/logger.d.ts +20 -31
  56. package/dist/src/logger.js +32 -42
  57. package/dist/src/modules/nats/nats-container.js +1 -1
  58. package/dist/src/network.js +6 -3
  59. package/dist/src/port-check.d.ts +3 -3
  60. package/dist/src/port-check.js +9 -5
  61. package/dist/src/port-forwarder.js +7 -5
  62. package/dist/src/reaper.js +16 -10
  63. package/dist/src/registry-auth-locator/credential-provider.js +3 -5
  64. package/dist/src/registry-auth-locator/get-auth-config.js +3 -3
  65. package/dist/src/system-info.js +2 -5
  66. package/dist/src/test-container.d.ts +1 -0
  67. package/dist/src/uuid.js +1 -1
  68. package/dist/src/wait-for-container.js +4 -4
  69. package/dist/src/wait-strategy/composite-wait-strategy.js +4 -4
  70. package/dist/src/wait-strategy/health-check-wait-strategy.js +8 -5
  71. package/dist/src/wait-strategy/host-port-wait-strategy.js +11 -11
  72. package/dist/src/wait-strategy/http-wait-strategy.js +9 -7
  73. package/dist/src/wait-strategy/log-wait-strategy.js +7 -7
  74. package/dist/src/wait-strategy/shell-wait-strategy.js +8 -8
  75. package/dist/src/wait-strategy/startup-check-strategy.js +8 -5
  76. package/dist/src/wait-strategy/wait-strategy.d.ts +6 -4
  77. package/dist/src/wait-strategy/wait-strategy.js +9 -2
  78. package/package.json +12 -12
  79. package/dist/src/docker/docker-client-config.js +0 -66
  80. package/dist/src/docker/docker-client.d.ts +0 -26
  81. package/dist/src/docker/docker-client.js +0 -156
  82. package/dist/src/docker/get-remote-docker-unix-socket-path.d.ts +0 -5
  83. package/dist/src/docker/get-remote-docker-unix-socket-path.js +0 -17
  84. package/dist/src/docker/pull-stream-parser.d.ts +0 -10
  85. package/dist/src/docker/pull-stream-parser.js +0 -20
@@ -16,7 +16,7 @@ exports.execContainer = void 0;
16
16
  const logger_1 = require("../../../logger");
17
17
  const byline_1 = __importDefault(require("byline"));
18
18
  const demux_stream_1 = require("../demux-stream");
19
- const execContainer = (dockerode, provider, container, command, shouldLog = true) => __awaiter(void 0, void 0, void 0, function* () {
19
+ const execContainer = (dockerode, containerRuntime, container, command, shouldLog = true) => __awaiter(void 0, void 0, void 0, function* () {
20
20
  const chunks = [];
21
21
  try {
22
22
  const exec = yield container.exec({
@@ -24,25 +24,27 @@ const execContainer = (dockerode, provider, container, command, shouldLog = true
24
24
  AttachStdout: true,
25
25
  AttachStderr: true,
26
26
  });
27
- const stream = yield startExec(dockerode, provider, exec);
27
+ const stream = yield startExec(dockerode, containerRuntime, exec, container);
28
28
  stream.on("data", (chunk) => chunks.push(chunk));
29
29
  if (shouldLog && logger_1.execLog.enabled()) {
30
- (0, byline_1.default)(stream).on("data", (line) => logger_1.execLog.trace(`${container.id}: ${line}`));
30
+ (0, byline_1.default)(stream).on("data", (line) => logger_1.execLog.trace(line, { containerId: container.id }));
31
31
  }
32
32
  const exitCode = yield waitForExec(exec, stream);
33
33
  stream.destroy();
34
34
  return { output: chunks.join(""), exitCode };
35
35
  }
36
36
  catch (err) {
37
- logger_1.log.error(`Failed to exec container ${container.id} with command "${command.join(" ")}": ${err}. Container output: ${chunks.join("")}`);
37
+ logger_1.log.error(`Failed to exec container with command "${command.join(" ")}": ${err}: ${chunks.join("")}`, {
38
+ containerId: container.id,
39
+ });
38
40
  throw err;
39
41
  }
40
42
  });
41
43
  exports.execContainer = execContainer;
42
- const startExec = (dockerode, provider, exec) => __awaiter(void 0, void 0, void 0, function* () {
44
+ const startExec = (dockerode, containerRuntime, exec, container) => __awaiter(void 0, void 0, void 0, function* () {
43
45
  try {
44
46
  const stream = yield exec.start({ stdin: true, Detach: false, Tty: true });
45
- if (provider === "podman") {
47
+ if (containerRuntime === "podman") {
46
48
  return (0, demux_stream_1.demuxStream)(dockerode, stream);
47
49
  }
48
50
  else {
@@ -50,7 +52,7 @@ const startExec = (dockerode, provider, exec) => __awaiter(void 0, void 0, void
50
52
  }
51
53
  }
52
54
  catch (err) {
53
- logger_1.log.error(`Failed to start exec: ${err}`);
55
+ logger_1.log.error(`Failed to start exec: ${err}`, { containerId: container.id });
54
56
  throw err;
55
57
  }
56
58
  });
@@ -10,12 +10,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.getContainerByHash = exports.getContainerById = void 0;
13
- const docker_client_1 = require("../../docker-client");
13
+ const docker_client_1 = require("../../client/docker-client");
14
14
  const logger_1 = require("../../../logger");
15
15
  const labels_1 = require("../../../labels");
16
16
  const getContainerById = (id) => __awaiter(void 0, void 0, void 0, function* () {
17
17
  try {
18
- const { dockerode } = yield (0, docker_client_1.dockerClient)();
18
+ const { dockerode } = yield (0, docker_client_1.getDockerClient)();
19
19
  return dockerode.getContainer(id);
20
20
  }
21
21
  catch (err) {
@@ -26,7 +26,7 @@ const getContainerById = (id) => __awaiter(void 0, void 0, void 0, function* ()
26
26
  exports.getContainerById = getContainerById;
27
27
  const getContainerByHash = (hash) => __awaiter(void 0, void 0, void 0, function* () {
28
28
  try {
29
- const { dockerode } = yield (0, docker_client_1.dockerClient)();
29
+ const { dockerode } = yield (0, docker_client_1.getDockerClient)();
30
30
  const containers = yield dockerode.listContainers({
31
31
  limit: 1,
32
32
  filters: {
@@ -42,7 +42,7 @@ const getContainerByHash = (hash) => __awaiter(void 0, void 0, void 0, function*
42
42
  }
43
43
  }
44
44
  catch (err) {
45
- logger_1.log.error(`Failed to get container by hash (${hash}): ${err}`);
45
+ logger_1.log.error(`Failed to get container by hash "${hash}": ${err}`);
46
46
  throw err;
47
47
  }
48
48
  });
@@ -31,7 +31,7 @@ const inspectContainer = (container) => __awaiter(void 0, void 0, void 0, functi
31
31
  };
32
32
  }
33
33
  catch (err) {
34
- logger_1.log.error(`Failed to inspect container ${container.id}: ${err}`);
34
+ logger_1.log.error(`Failed to inspect container: ${err}`, { containerId: container.id });
35
35
  throw err;
36
36
  }
37
37
  });
@@ -10,11 +10,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.listContainers = void 0;
13
- const docker_client_1 = require("../../docker-client");
13
+ const docker_client_1 = require("../../client/docker-client");
14
14
  const logger_1 = require("../../../logger");
15
15
  const listContainers = () => __awaiter(void 0, void 0, void 0, function* () {
16
16
  try {
17
- const { dockerode } = yield (0, docker_client_1.dockerClient)();
17
+ const { dockerode } = yield (0, docker_client_1.getDockerClient)();
18
18
  return yield dockerode.listContainers();
19
19
  }
20
20
  catch (err) {
@@ -19,7 +19,7 @@ const putContainerArchive = (options) => __awaiter(void 0, void 0, void 0, funct
19
19
  yield (0, stream_utils_1.streamToString)(stream_1.Readable.from(stream));
20
20
  }
21
21
  catch (err) {
22
- logger_1.log.error(`Failed to put archive to container ${options.container.id}: ${err}`);
22
+ logger_1.log.error(`Failed to put archive to container: ${err}`, { containerId: options.container.id });
23
23
  throw err;
24
24
  }
25
25
  });
@@ -16,7 +16,7 @@ const removeContainer = (container, options) => __awaiter(void 0, void 0, void 0
16
16
  yield container.remove({ v: options.removeVolumes });
17
17
  }
18
18
  catch (err) {
19
- logger_1.log.error(`Failed to remove container ${container.id}: ${err}`);
19
+ logger_1.log.error(`Failed to remove container: ${err}`, { containerId: container.id });
20
20
  throw err;
21
21
  }
22
22
  });
@@ -16,7 +16,7 @@ const restartContainer = (container, options) => __awaiter(void 0, void 0, void
16
16
  yield container.restart({ t: options.timeout / 1000 });
17
17
  }
18
18
  catch (err) {
19
- logger_1.log.error(`Failed to restart container ${container.id}: ${err}`);
19
+ logger_1.log.error(`Failed to restart container: ${err}`, { containerId: container.id });
20
20
  throw err;
21
21
  }
22
22
  });
@@ -16,7 +16,7 @@ const startContainer = (container) => __awaiter(void 0, void 0, void 0, function
16
16
  yield container.start();
17
17
  }
18
18
  catch (err) {
19
- logger_1.log.error(`Failed to start container ${container.id}: ${err}`);
19
+ logger_1.log.error(`Failed to start container: ${err}`, { containerId: container.id });
20
20
  throw err;
21
21
  }
22
22
  });
@@ -18,10 +18,10 @@ const stopContainer = (container, options) => __awaiter(void 0, void 0, void 0,
18
18
  }
19
19
  catch (err) {
20
20
  if (err.statusCode === 304) {
21
- logger_1.log.info(`Container has already been stopped: ${container.id}`);
21
+ logger_1.log.info(`Container has already been stopped`, { containerId: container.id });
22
22
  }
23
23
  else {
24
- logger_1.log.error(`Failed to stop container ${container.id}: ${err}`);
24
+ logger_1.log.error(`Failed to stop container: ${err}`, { containerId: container.id });
25
25
  throw err;
26
26
  }
27
27
  }
@@ -6,9 +6,6 @@ const labels_1 = require("../../labels");
6
6
  const package_json_1 = require("../../../package.json");
7
7
  const createLabels = (reusable, dockerImageName, extraLabels = {}) => {
8
8
  const labels = Object.assign(Object.assign({}, extraLabels), { [labels_1.LABEL_TESTCONTAINERS]: "true", [labels_1.LABEL_TESTCONTAINERS_LANG]: "node", [labels_1.LABEL_TESTCONTAINERS_VERSION]: package_json_1.version });
9
- if (dockerImageName && dockerImageName.isReaper()) {
10
- return labels;
11
- }
12
9
  if (!reusable) {
13
10
  labels[labels_1.LABEL_TESTCONTAINERS_SESSION_ID] = session_id_1.sessionId;
14
11
  }
@@ -16,14 +16,14 @@ exports.buildImage = void 0;
16
16
  const logger_1 = require("../../../logger");
17
17
  const tar_fs_1 = __importDefault(require("tar-fs"));
18
18
  const byline_1 = __importDefault(require("byline"));
19
- const docker_client_1 = require("../../docker-client");
19
+ const docker_client_1 = require("../../client/docker-client");
20
20
  const create_labels_1 = require("../create-labels");
21
21
  const path_1 = __importDefault(require("path"));
22
22
  const fs_1 = require("fs");
23
23
  const dockerignore_1 = __importDefault(require("@balena/dockerignore"));
24
24
  const buildImage = (options) => __awaiter(void 0, void 0, void 0, function* () {
25
25
  try {
26
- logger_1.log.info(`Building image '${options.imageName.toString()}' with context '${options.context}'`);
26
+ logger_1.log.info(`Building image "${options.imageName.toString()}" with context "${options.context}"...`);
27
27
  const isDockerIgnored = yield createIsDockerIgnoredFunction(options.context);
28
28
  const tarStream = tar_fs_1.default.pack(options.context, {
29
29
  ignore: (aPath) => {
@@ -36,7 +36,7 @@ const buildImage = (options) => __awaiter(void 0, void 0, void 0, function* () {
36
36
  }
37
37
  },
38
38
  });
39
- const { dockerode } = yield (0, docker_client_1.dockerClient)();
39
+ const { dockerode } = yield (0, docker_client_1.getDockerClient)();
40
40
  const buildImageOptions = {
41
41
  dockerfile: options.dockerfileName,
42
42
  nocache: !options.cache,
@@ -46,16 +46,21 @@ const buildImage = (options) => __awaiter(void 0, void 0, void 0, function* () {
46
46
  registryconfig: options.registryConfig,
47
47
  pull: options.pullPolicy.shouldPull() ? "true" : undefined,
48
48
  };
49
- return new Promise((resolve) => {
49
+ yield new Promise((resolve) => {
50
50
  dockerode
51
51
  .buildImage(tarStream, buildImageOptions)
52
52
  .then((stream) => (0, byline_1.default)(stream))
53
53
  .then((stream) => {
54
54
  stream.setEncoding("utf-8");
55
- stream.on("data", (line) => logger_1.log.trace(`${options.imageName.toString()}: ${line}`));
55
+ stream.on("data", (line) => {
56
+ if (logger_1.buildLog.enabled()) {
57
+ logger_1.buildLog.trace(line, { imageName: options.imageName.toString() });
58
+ }
59
+ });
56
60
  stream.on("end", () => resolve());
57
61
  });
58
62
  });
63
+ logger_1.log.info(`Built image "${options.imageName.toString()}" with context "${options.context}"`);
59
64
  }
60
65
  catch (err) {
61
66
  logger_1.log.error(`Failed to build image: ${err}`);
@@ -14,23 +14,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.pullImage = void 0;
16
16
  const logger_1 = require("../../../logger");
17
- const pull_stream_parser_1 = require("../../pull-stream-parser");
18
17
  const image_exists_1 = require("./image-exists");
19
18
  const get_auth_config_1 = require("../../../registry-auth-locator/get-auth-config");
20
19
  const async_lock_1 = __importDefault(require("async-lock"));
20
+ const byline_1 = __importDefault(require("byline"));
21
21
  const imagePullLock = new async_lock_1.default();
22
22
  const pullImage = (dockerode, indexServerAddress, options) => __awaiter(void 0, void 0, void 0, function* () {
23
23
  try {
24
24
  return imagePullLock.acquire(options.imageName.toString(), () => __awaiter(void 0, void 0, void 0, function* () {
25
25
  var _a;
26
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}`);
27
+ logger_1.log.debug(`Not pulling image "${options.imageName}" as it already exists`);
28
28
  return;
29
29
  }
30
- logger_1.log.info(`Pulling image: ${options.imageName}`);
30
+ logger_1.log.info(`Pulling image "${options.imageName}"...`);
31
31
  const authconfig = yield (0, get_auth_config_1.getAuthConfig)((_a = options.imageName.registry) !== null && _a !== void 0 ? _a : indexServerAddress);
32
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);
33
+ return new Promise((resolve) => {
34
+ (0, byline_1.default)(stream).on("data", (line) => {
35
+ if (logger_1.pullLog.enabled()) {
36
+ logger_1.pullLog.trace(line, { imageName: options.imageName.toString() });
37
+ }
38
+ });
39
+ stream.on("end", resolve);
40
+ });
34
41
  }));
35
42
  }
36
43
  catch (err) {
@@ -11,16 +11,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.connectNetwork = void 0;
13
13
  const logger_1 = require("../../../logger");
14
- const docker_client_1 = require("../../docker-client");
14
+ const docker_client_1 = require("../../client/docker-client");
15
15
  const connectNetwork = (options) => __awaiter(void 0, void 0, void 0, function* () {
16
16
  try {
17
- logger_1.log.info(`Connecting container ${options.containerId} to network ${options.networkId}`);
18
- const { dockerode } = yield (0, docker_client_1.dockerClient)();
17
+ logger_1.log.info(`Connecting to network "${options.networkId}"...`, { containerId: options.containerId });
18
+ const { dockerode } = yield (0, docker_client_1.getDockerClient)();
19
19
  const network = dockerode.getNetwork(options.networkId);
20
20
  yield network.connect({ Container: options.containerId, EndpointConfig: { Aliases: options.networkAliases } });
21
+ logger_1.log.info(`Connected to network "${options.networkId}"...`, { containerId: options.containerId });
21
22
  }
22
23
  catch (err) {
23
- logger_1.log.error(`Failed to connect container ${options.containerId} to network ${options.networkId}: ${err}`);
24
+ logger_1.log.error(`Failed to connect to network "${options.networkId}": ${err}`, { containerId: options.containerId });
24
25
  throw err;
25
26
  }
26
27
  });
@@ -11,12 +11,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.createNetwork = void 0;
13
13
  const logger_1 = require("../../../logger");
14
- const docker_client_1 = require("../../docker-client");
14
+ const docker_client_1 = require("../../client/docker-client");
15
15
  const create_labels_1 = require("../create-labels");
16
16
  const createNetwork = (options) => __awaiter(void 0, void 0, void 0, function* () {
17
17
  try {
18
- logger_1.log.info(`Creating network ${options.name}`);
19
- const { dockerode } = yield (0, docker_client_1.dockerClient)();
18
+ logger_1.log.info(`Creating network "${options.name}"...`);
19
+ const { dockerode } = yield (0, docker_client_1.getDockerClient)();
20
20
  const network = yield dockerode.createNetwork({
21
21
  Name: options.name,
22
22
  CheckDuplicate: options.checkDuplicate,
@@ -28,6 +28,7 @@ const createNetwork = (options) => __awaiter(void 0, void 0, void 0, function* (
28
28
  Options: options.options,
29
29
  Labels: Object.assign(Object.assign({}, options.labels), (0, create_labels_1.createLabels)(false)),
30
30
  });
31
+ logger_1.log.info(`Created network "${options.name}"`);
31
32
  return network.id;
32
33
  }
33
34
  catch (err) {
@@ -11,19 +11,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.removeNetwork = void 0;
13
13
  const logger_1 = require("../../../logger");
14
- const docker_client_1 = require("../../docker-client");
14
+ const docker_client_1 = require("../../client/docker-client");
15
15
  const removeNetwork = (id) => __awaiter(void 0, void 0, void 0, function* () {
16
16
  try {
17
- logger_1.log.info(`Removing network ${id}`);
18
- const { dockerode } = yield (0, docker_client_1.dockerClient)();
17
+ logger_1.log.info(`Removing network "${id}"...`);
18
+ const { dockerode } = yield (0, docker_client_1.getDockerClient)();
19
19
  const network = dockerode.getNetwork(id);
20
20
  const { message } = yield network.remove();
21
21
  if (message) {
22
22
  logger_1.log.warn(message);
23
23
  }
24
+ logger_1.log.info(`Removed network "${id}"`);
24
25
  }
25
26
  catch (err) {
26
- logger_1.log.error(`Failed to remove network ${id}: ${err}`);
27
+ logger_1.log.error(`Failed to remove network "${id}": ${err}`);
27
28
  throw err;
28
29
  }
29
30
  });
@@ -19,20 +19,20 @@ const stream_utils_1 = require("../../stream-utils");
19
19
  const runInContainer = (dockerode, indexServerAddress, image, command) => __awaiter(void 0, void 0, void 0, function* () {
20
20
  try {
21
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(" ")}`);
22
+ logger_1.log.debug(`Creating container: ${image} with command "${command.join(" ")}"...`);
23
23
  const container = yield dockerode.createContainer({ Image: image, Cmd: command });
24
- logger_1.log.debug(`Attaching to container: ${container.id}`);
24
+ logger_1.log.debug(`Attaching to container...`, { containerId: container.id });
25
25
  const stream = yield (0, attach_container_1.attachContainer)(dockerode, container);
26
- logger_1.log.debug(`Starting container: ${container.id}`);
26
+ logger_1.log.debug(`Starting container...`, { containerId: container.id });
27
27
  yield (0, start_container_1.startContainer)(container);
28
- logger_1.log.debug(`Waiting for container output: ${container.id}`);
28
+ logger_1.log.debug(`Waiting for container output...`, { containerId: container.id });
29
29
  const output = yield (0, stream_utils_1.streamToString)(stream, { trim: true });
30
- logger_1.log.debug(`Removing container: ${container.id}`);
30
+ logger_1.log.debug(`Removing container...`, { containerId: container.id });
31
31
  yield container.remove({ force: true, v: true });
32
32
  return output.length === 0 ? undefined : output;
33
33
  }
34
34
  catch (err) {
35
- logger_1.log.error(`Failed to run command in container: "${command.join(" ")}", error: "${err}"`);
35
+ logger_1.log.error(`Failed to run command "${command.join(" ")}" in container: "${err}"`);
36
36
  return undefined;
37
37
  }
38
38
  });
@@ -0,0 +1,6 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ /// <reference types="node" />
4
+ /// <reference types="node" />
5
+ import { DockerClient } from "./client/docker-client";
6
+ export declare const getRemoteDockerUnixSocketPath: (dockerClient: DockerClient, platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv) => string;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRemoteDockerUnixSocketPath = void 0;
4
+ const getRemoteDockerUnixSocketPath = (dockerClient, platform = process.platform, env = process.env) => {
5
+ if (dockerClient.allowUserOverrides) {
6
+ if (env["TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE"] !== undefined) {
7
+ return env["TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE"];
8
+ }
9
+ }
10
+ let socketPath;
11
+ if (dockerClient.info.dockerInfo.operatingSystem === "Docker Desktop") {
12
+ socketPath = "/var/run/docker.sock";
13
+ }
14
+ else if (dockerClient.uri.startsWith("unix://")) {
15
+ socketPath = dockerClient.uri.replace("unix://", "");
16
+ }
17
+ else {
18
+ socketPath = "/var/run/docker.sock";
19
+ }
20
+ return platform === "win32" ? `/${socketPath}` : socketPath;
21
+ };
22
+ exports.getRemoteDockerUnixSocketPath = getRemoteDockerUnixSocketPath;
@@ -3,5 +3,5 @@
3
3
  /// <reference types="node" />
4
4
  /// <reference types="node" />
5
5
  import Dockerode from "dockerode";
6
- import { Provider } from "./docker-client";
7
- export declare const resolveHost: (dockerode: Dockerode, provider: Provider, indexServerAddress: string, uri: string, env?: NodeJS.ProcessEnv) => Promise<string>;
6
+ import { ContainerRuntime } from "./types";
7
+ export declare const resolveHost: (dockerode: Dockerode, containerRuntime: ContainerRuntime, indexServerAddress: string, uri: string, allowUserOverrides: boolean, env?: NodeJS.ProcessEnv) => Promise<string>;
@@ -14,9 +14,11 @@ const url_1 = require("url");
14
14
  const logger_1 = require("../logger");
15
15
  const run_in_container_1 = require("./functions/run-in-container");
16
16
  const fs_1 = require("fs");
17
- const resolveHost = (dockerode, provider, indexServerAddress, uri, env = process.env) => __awaiter(void 0, void 0, void 0, function* () {
18
- if (env.TESTCONTAINERS_HOST_OVERRIDE !== undefined) {
19
- return env.TESTCONTAINERS_HOST_OVERRIDE;
17
+ const resolveHost = (dockerode, containerRuntime, indexServerAddress, uri, allowUserOverrides, env = process.env) => __awaiter(void 0, void 0, void 0, function* () {
18
+ if (allowUserOverrides) {
19
+ if (env.TESTCONTAINERS_HOST_OVERRIDE !== undefined) {
20
+ return env.TESTCONTAINERS_HOST_OVERRIDE;
21
+ }
20
22
  }
21
23
  const { protocol, hostname } = new url_1.URL(uri);
22
24
  switch (protocol) {
@@ -27,7 +29,7 @@ const resolveHost = (dockerode, provider, indexServerAddress, uri, env = process
27
29
  case "unix:":
28
30
  case "npipe:": {
29
31
  if (isInContainer()) {
30
- const networkName = provider === "podman" ? "podman" : "bridge";
32
+ const networkName = containerRuntime === "podman" ? "podman" : "bridge";
31
33
  const gateway = yield findGateway(dockerode, networkName);
32
34
  if (gateway !== undefined) {
33
35
  return gateway;
@@ -46,12 +48,12 @@ const resolveHost = (dockerode, provider, indexServerAddress, uri, env = process
46
48
  exports.resolveHost = resolveHost;
47
49
  const findGateway = (dockerode, networkName) => __awaiter(void 0, void 0, void 0, function* () {
48
50
  var _a, _b, _c;
49
- logger_1.log.debug(`Checking gateway for Docker host`);
51
+ logger_1.log.debug(`Checking gateway for Docker host...`);
50
52
  const inspectResult = yield dockerode.getNetwork(networkName).inspect();
51
53
  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;
52
54
  });
53
55
  const findDefaultGateway = (dockerode, indexServerAddress) => __awaiter(void 0, void 0, void 0, function* () {
54
- logger_1.log.debug(`Checking default gateway for Docker host`);
56
+ logger_1.log.debug(`Checking default gateway for Docker host...`);
55
57
  return (0, run_in_container_1.runInContainer)(dockerode, indexServerAddress, "alpine:3.14", [
56
58
  "sh",
57
59
  "-c",
@@ -1,6 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="node" />
3
3
  import { Readable } from "stream";
4
+ export type ContainerRuntime = "docker" | "podman";
4
5
  export type Environment = {
5
6
  [key in string]: string;
6
7
  };
@@ -21,22 +21,24 @@ var __rest = (this && this.__rest) || function (s, e) {
21
21
  };
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
23
  exports.defaultDockerComposeOptions = void 0;
24
- const docker_client_1 = require("../docker/docker-client");
24
+ const docker_client_1 = require("../docker/client/docker-client");
25
25
  const logger_1 = require("../logger");
26
26
  const os_1 = require("os");
27
27
  const type_guards_1 = require("../type-guards");
28
28
  const defaultDockerComposeOptions = (_a) => __awaiter(void 0, void 0, void 0, function* () {
29
+ var _b;
29
30
  var { environment = {} } = _a, options = __rest(_a, ["environment"]);
30
- const { composeEnvironment } = yield (0, docker_client_1.dockerClient)();
31
+ const { composeEnvironment } = yield (0, docker_client_1.getDockerClient)();
32
+ const log = (_b = options.logger) !== null && _b !== void 0 ? _b : logger_1.composeLog;
31
33
  return {
32
34
  log: false,
33
- callback: logger_1.log.enabled()
35
+ callback: log.enabled()
34
36
  ? (chunk) => {
35
37
  chunk
36
38
  .toString()
37
39
  .split(os_1.EOL)
38
40
  .filter(type_guards_1.isNotEmptyString)
39
- .forEach((line) => logger_1.log.trace(line.trim()));
41
+ .forEach((line) => log.trace(line.trim()));
40
42
  }
41
43
  : undefined,
42
44
  cwd: options.filePath,
@@ -1,4 +1,5 @@
1
1
  import { Environment } from "../docker/types";
2
+ import { Logger } from "../logger";
2
3
  export type DockerComposeOptions = {
3
4
  filePath: string;
4
5
  files: string | string[];
@@ -6,4 +7,5 @@ export type DockerComposeOptions = {
6
7
  commandOptions?: string[];
7
8
  composeOptions?: string[];
8
9
  environment?: Environment;
10
+ logger?: Logger;
9
11
  };
@@ -14,7 +14,7 @@ const logger_1 = require("../../logger");
14
14
  const default_docker_compose_options_1 = require("../default-docker-compose-options");
15
15
  const docker_compose_1 = require("docker-compose");
16
16
  const dockerComposeDown = (options, downOptions) => __awaiter(void 0, void 0, void 0, function* () {
17
- logger_1.log.info(`Downing DockerCompose environment`);
17
+ logger_1.log.info(`Downing DockerCompose environment...`);
18
18
  try {
19
19
  yield (0, docker_compose_1.down)(Object.assign(Object.assign({}, (yield (0, default_docker_compose_options_1.defaultDockerComposeOptions)(options))), { commandOptions: commandOptions(downOptions) }));
20
20
  logger_1.log.info(`Downed DockerCompose environment`);
@@ -16,12 +16,12 @@ const default_docker_compose_options_1 = require("../default-docker-compose-opti
16
16
  const dockerComposePull = (options, services) => __awaiter(void 0, void 0, void 0, function* () {
17
17
  try {
18
18
  if (services) {
19
- logger_1.log.info(`Pulling DockerCompose environment images for ${services.join(", ")}`);
20
- yield (0, docker_compose_1.pullMany)(services, yield (0, default_docker_compose_options_1.defaultDockerComposeOptions)(options));
19
+ logger_1.log.info(`Pulling DockerCompose environment images "${services.join('", "')}"...`);
20
+ yield (0, docker_compose_1.pullMany)(services, yield (0, default_docker_compose_options_1.defaultDockerComposeOptions)(Object.assign(Object.assign({}, options), { logger: logger_1.pullLog })));
21
21
  }
22
22
  else {
23
- logger_1.log.info(`Pulling DockerCompose environment images`);
24
- yield (0, docker_compose_1.pullAll)(yield (0, default_docker_compose_options_1.defaultDockerComposeOptions)(options));
23
+ logger_1.log.info(`Pulling DockerCompose environment images...`);
24
+ yield (0, docker_compose_1.pullAll)(yield (0, default_docker_compose_options_1.defaultDockerComposeOptions)(Object.assign(Object.assign({}, options), { logger: logger_1.pullLog })));
25
25
  }
26
26
  logger_1.log.info(`Pulled DockerCompose environment`);
27
27
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -14,7 +14,7 @@ const logger_1 = require("../../logger");
14
14
  const docker_compose_1 = require("docker-compose");
15
15
  const default_docker_compose_options_1 = require("../default-docker-compose-options");
16
16
  const dockerComposeStop = (options) => __awaiter(void 0, void 0, void 0, function* () {
17
- logger_1.log.info(`Stopping DockerCompose environment`);
17
+ logger_1.log.info(`Stopping DockerCompose environment...`);
18
18
  try {
19
19
  yield (0, docker_compose_1.stop)(yield (0, default_docker_compose_options_1.defaultDockerComposeOptions)(options));
20
20
  logger_1.log.info(`Stopped DockerCompose environment`);
@@ -15,7 +15,7 @@ const docker_compose_1 = require("docker-compose");
15
15
  const default_docker_compose_options_1 = require("../default-docker-compose-options");
16
16
  const docker_compose_down_1 = require("./docker-compose-down");
17
17
  const dockerComposeUp = (options, services) => __awaiter(void 0, void 0, void 0, function* () {
18
- logger_1.log.info(`Upping DockerCompose environment`);
18
+ logger_1.log.info(`Upping DockerCompose environment...`);
19
19
  try {
20
20
  if (services) {
21
21
  yield (0, docker_compose_1.upMany)(services, yield (0, default_docker_compose_options_1.defaultDockerComposeOptions)(options));
@@ -18,7 +18,7 @@ const reaper_1 = require("../reaper");
18
18
  const uuid_1 = require("../uuid");
19
19
  const list_containers_1 = require("../docker/functions/container/list-containers");
20
20
  const get_container_1 = require("../docker/functions/container/get-container");
21
- const docker_client_1 = require("../docker/docker-client");
21
+ const docker_client_1 = require("../docker/client/docker-client");
22
22
  const inspect_container_1 = require("../docker/functions/container/inspect-container");
23
23
  const container_logs_1 = require("../docker/functions/container/container-logs");
24
24
  const started_docker_compose_environment_1 = require("./started-docker-compose-environment");
@@ -76,7 +76,7 @@ class DockerComposeEnvironment {
76
76
  }
77
77
  up(services) {
78
78
  return __awaiter(this, void 0, void 0, function* () {
79
- logger_1.log.info(`Starting DockerCompose environment: ${this.projectName}`);
79
+ logger_1.log.info(`Starting DockerCompose environment "${this.projectName}"...`);
80
80
  (yield reaper_1.ReaperInstance.getInstance()).addProject(this.projectName);
81
81
  const options = {
82
82
  filePath: this.composeFilePath,
@@ -104,11 +104,11 @@ class DockerComposeEnvironment {
104
104
  ...containerNames,
105
105
  startedContainer.Names.join(", "),
106
106
  ], []);
107
- logger_1.log.info(`Started the following containers: ${startedContainerNames.join(", ")}`);
107
+ logger_1.log.info(`Started containers "${startedContainerNames.join('", "')}"`);
108
108
  const startedGenericContainers = (yield Promise.all(startedContainers.map((startedContainer) => __awaiter(this, void 0, void 0, function* () {
109
109
  const container = yield (0, get_container_1.getContainerById)(startedContainer.Id);
110
110
  const containerName = (0, container_name_resolver_1.resolveContainerName)(this.projectName, startedContainer.Names[0]);
111
- const { host, hostIps } = yield (0, docker_client_1.dockerClient)();
111
+ const { host, hostIps } = yield (0, docker_client_1.getDockerClient)();
112
112
  const inspectResult = yield (0, inspect_container_1.inspectContainer)(container);
113
113
  const boundPorts = bound_ports_1.BoundPorts.fromInspectResult(hostIps, inspectResult);
114
114
  const waitStrategy = this.waitStrategy[containerName]
@@ -123,12 +123,9 @@ class DockerComposeEnvironment {
123
123
  .on("err", (data) => logger_1.containerLog.error(`${containerName}: ${data.trim()}`));
124
124
  }
125
125
  try {
126
- logger_1.log.info(`Waiting for container ${containerName} to be ready`);
127
126
  yield (0, wait_for_container_1.waitForContainer)(container, waitStrategy, boundPorts);
128
- logger_1.log.info(`Container ${containerName} is ready`);
129
127
  }
130
128
  catch (err) {
131
- logger_1.log.error(`Container ${containerName} failed to be ready: ${err}`);
132
129
  try {
133
130
  yield (0, docker_compose_down_1.dockerComposeDown)(options, { removeVolumes: true, timeout: 0 });
134
131
  }
@@ -142,7 +139,7 @@ class DockerComposeEnvironment {
142
139
  const containerName = startedGenericContainer.getName();
143
140
  return Object.assign(Object.assign({}, map), { [containerName]: startedGenericContainer });
144
141
  }, {});
145
- logger_1.log.info(`DockerCompose environment started: ${Object.keys(startedGenericContainers).join(", ")}`);
142
+ logger_1.log.info(`DockerCompose environment started`);
146
143
  return new started_docker_compose_environment_1.StartedDockerComposeEnvironment(startedGenericContainers, Object.assign(Object.assign({}, options), { composeOptions, environment: this.environment }));
147
144
  });
148
145
  }
@@ -23,7 +23,7 @@ const dockerfile_parser_1 = require("../dockerfile-parser");
23
23
  const build_image_1 = require("../docker/functions/image/build-image");
24
24
  const get_auth_config_1 = require("../registry-auth-locator/get-auth-config");
25
25
  const generic_container_1 = require("./generic-container");
26
- const docker_client_1 = require("../docker/docker-client");
26
+ const docker_client_1 = require("../docker/client/docker-client");
27
27
  const image_exists_1 = require("../docker/functions/image/image-exists");
28
28
  class GenericContainerBuilder {
29
29
  constructor(context, dockerfileName, uuid = new uuid_1.RandomUuid()) {
@@ -52,10 +52,10 @@ class GenericContainerBuilder {
52
52
  const imageName = docker_image_name_1.DockerImageName.fromString(image);
53
53
  yield reaper_1.ReaperInstance.getInstance();
54
54
  const dockerfile = path_1.default.resolve(this.context, this.dockerfileName);
55
- logger_1.log.debug(`Preparing to build Dockerfile: ${dockerfile}`);
55
+ logger_1.log.debug(`Preparing to build Dockerfile "${dockerfile}" as image "${imageName}"...`);
56
56
  const imageNames = yield (0, dockerfile_parser_1.getDockerfileImages)(dockerfile, this.buildArgs);
57
- const { dockerode, indexServerAddress } = yield (0, docker_client_1.dockerClient)();
58
- const registryConfig = yield this.getRegistryConfig(indexServerAddress, imageNames);
57
+ const { dockerode, info } = yield (0, docker_client_1.getDockerClient)();
58
+ const registryConfig = yield this.getRegistryConfig(info.dockerInfo.indexServerAddress, imageNames);
59
59
  yield (0, build_image_1.buildImage)({
60
60
  imageName: imageName,
61
61
  context: this.context,