testcontainers 9.6.0 → 9.7.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 (57) hide show
  1. package/dist/package.json +12 -12
  2. package/dist/src/docker/docker-client-config.js +42 -36
  3. package/dist/src/docker/docker-client.js +3 -3
  4. package/dist/src/docker/functions/container/attach-container.js +1 -1
  5. package/dist/src/docker/functions/container/create-container.js +6 -4
  6. package/dist/src/docker/functions/container/exec-container.js +7 -5
  7. package/dist/src/docker/functions/container/get-container.js +1 -1
  8. package/dist/src/docker/functions/container/inspect-container.js +1 -1
  9. package/dist/src/docker/functions/container/put-container-archive.js +1 -1
  10. package/dist/src/docker/functions/container/remove-container.js +1 -1
  11. package/dist/src/docker/functions/container/restart-container.js +1 -1
  12. package/dist/src/docker/functions/container/start-container.js +1 -1
  13. package/dist/src/docker/functions/container/stop-container.js +2 -2
  14. package/dist/src/docker/functions/create-labels.js +0 -3
  15. package/dist/src/docker/functions/image/build-image.js +8 -3
  16. package/dist/src/docker/functions/image/pull-image.js +3 -3
  17. package/dist/src/docker/functions/network/connect-network.js +3 -2
  18. package/dist/src/docker/functions/network/create-network.js +2 -1
  19. package/dist/src/docker/functions/network/remove-network.js +3 -2
  20. package/dist/src/docker/functions/run-in-container.js +6 -6
  21. package/dist/src/docker/pull-stream-parser.js +5 -1
  22. package/dist/src/docker/resolve-host.js +2 -2
  23. package/dist/src/docker-compose/default-docker-compose-options.js +4 -2
  24. package/dist/src/docker-compose/docker-compose-options.d.ts +2 -0
  25. package/dist/src/docker-compose/functions/docker-compose-down.js +1 -1
  26. package/dist/src/docker-compose/functions/docker-compose-pull.js +4 -4
  27. package/dist/src/docker-compose/functions/docker-compose-stop.js +1 -1
  28. package/dist/src/docker-compose/functions/docker-compose-up.js +1 -1
  29. package/dist/src/docker-compose-environment/docker-compose-environment.js +3 -6
  30. package/dist/src/generic-container/generic-container-builder.js +1 -1
  31. package/dist/src/generic-container/generic-container.d.ts +4 -0
  32. package/dist/src/generic-container/generic-container.js +18 -7
  33. package/dist/src/generic-container/started-generic-container.js +10 -5
  34. package/dist/src/images.js +1 -1
  35. package/dist/src/logger.d.ts +20 -31
  36. package/dist/src/logger.js +32 -42
  37. package/dist/src/modules/nats/nats-container.js +1 -1
  38. package/dist/src/network.js +6 -3
  39. package/dist/src/port-check.js +6 -2
  40. package/dist/src/port-forwarder.js +5 -3
  41. package/dist/src/reaper.js +11 -7
  42. package/dist/src/registry-auth-locator/credential-provider.js +3 -5
  43. package/dist/src/registry-auth-locator/get-auth-config.js +3 -3
  44. package/dist/src/system-info.js +2 -5
  45. package/dist/src/test-container.d.ts +1 -0
  46. package/dist/src/uuid.js +1 -1
  47. package/dist/src/wait-for-container.js +4 -4
  48. package/dist/src/wait-strategy/composite-wait-strategy.js +4 -4
  49. package/dist/src/wait-strategy/health-check-wait-strategy.js +8 -5
  50. package/dist/src/wait-strategy/host-port-wait-strategy.js +8 -8
  51. package/dist/src/wait-strategy/http-wait-strategy.js +7 -5
  52. package/dist/src/wait-strategy/log-wait-strategy.js +7 -7
  53. package/dist/src/wait-strategy/shell-wait-strategy.js +5 -5
  54. package/dist/src/wait-strategy/startup-check-strategy.js +6 -3
  55. package/dist/src/wait-strategy/wait-strategy.d.ts +6 -4
  56. package/dist/src/wait-strategy/wait-strategy.js +9 -2
  57. package/package.json +12 -12
package/dist/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "testcontainers",
3
3
  "author": "Cristian Greco",
4
- "version": "9.6.0",
4
+ "version": "9.7.0",
5
5
  "main": "dist/src/index",
6
6
  "types": "dist/src/index",
7
7
  "keywords": [
@@ -56,31 +56,31 @@
56
56
  "@types/async-lock": "^1.4.0",
57
57
  "@types/byline": "^4.2.33",
58
58
  "@types/debug": "4.1.7",
59
- "@types/jest": "^29.5.0",
60
- "@types/node": "^18.15.11",
59
+ "@types/jest": "^29.5.1",
60
+ "@types/node": "^18.16.2",
61
61
  "@types/node-fetch": "^2.6.3",
62
62
  "@types/pg": "^8.6.6",
63
63
  "@types/properties-reader": "^2.1.1",
64
64
  "@types/tar-fs": "^2.0.1",
65
- "@typescript-eslint/eslint-plugin": "^5.57.0",
66
- "@typescript-eslint/parser": "^5.57.0",
67
- "arangojs": "^8.2.0",
65
+ "@typescript-eslint/eslint-plugin": "^5.59.1",
66
+ "@typescript-eslint/parser": "^5.59.1",
67
+ "arangojs": "^8.2.1",
68
68
  "cross-env": "^7.0.3",
69
- "eslint": "^8.37.0",
69
+ "eslint": "^8.39.0",
70
70
  "eslint-config-prettier": "^8.8.0",
71
71
  "eslint-plugin-prettier": "^4.2.1",
72
72
  "husky": "^8.0.3",
73
73
  "jest": "^29.5.0",
74
74
  "kafkajs": "^2.2.4",
75
- "lint-staged": "^13.2.0",
76
- "mongoose": "^6.10.4",
75
+ "lint-staged": "^13.2.2",
76
+ "mongoose": "^6.10.5",
77
77
  "mysql2": "^2.3.3",
78
78
  "nats": "^2.13.1",
79
- "neo4j-driver": "^5.6.0",
79
+ "neo4j-driver": "^5.7.0",
80
80
  "pg": "^8.10.0",
81
- "prettier": "^2.8.7",
81
+ "prettier": "^2.8.8",
82
82
  "rimraf": "^3.0.2",
83
- "ts-jest": "^29.0.5",
83
+ "ts-jest": "^29.1.0",
84
84
  "ts-node": "^10.9.1",
85
85
  "typescript": "^4.9.5",
86
86
  "wait-for-expect": "^3.0.2"
@@ -20,47 +20,53 @@ const fs_1 = require("fs");
20
20
  const promises_1 = require("fs/promises");
21
21
  const properties_reader_1 = __importDefault(require("properties-reader"));
22
22
  const getDockerClientConfig = (env = process.env) => __awaiter(void 0, void 0, void 0, function* () {
23
- let dockerHost;
24
- let dockerTlsVerify;
25
- let dockerCertPath;
26
- const file = path_1.default.resolve((0, os_1.homedir)(), ".testcontainers.properties");
27
- if ((0, fs_1.existsSync)(file)) {
28
- logger_1.log.debug("Found .testcontainers.properties file");
29
- const string = yield (0, promises_1.readFile)(file, { encoding: "utf-8" });
30
- const properties = (0, properties_reader_1.default)("").read(string);
31
- const host = properties.get("docker.host");
32
- if (host !== null) {
33
- dockerHost = host;
34
- }
35
- const tlsVerify = properties.get("docker.tls.verify");
36
- if (tlsVerify !== null) {
37
- dockerTlsVerify = `${tlsVerify}`;
38
- }
39
- const certPath = properties.get("docker.cert.path");
40
- if (certPath !== null) {
41
- dockerCertPath = certPath;
23
+ const dockerClientConfig = Object.assign(Object.assign({}, (yield loadFromFile())), loadFromEnv(env));
24
+ logDockerClientConfig(dockerClientConfig);
25
+ return dockerClientConfig;
26
+ });
27
+ exports.getDockerClientConfig = getDockerClientConfig;
28
+ function loadFromFile() {
29
+ return __awaiter(this, void 0, void 0, function* () {
30
+ const file = path_1.default.resolve((0, os_1.homedir)(), ".testcontainers.properties");
31
+ const dockerClientConfig = {};
32
+ if ((0, fs_1.existsSync)(file)) {
33
+ logger_1.log.debug(`Found ".testcontainers.properties" file`);
34
+ const string = yield (0, promises_1.readFile)(file, { encoding: "utf-8" });
35
+ const properties = (0, properties_reader_1.default)("").read(string);
36
+ const host = properties.get("docker.host");
37
+ if (host !== null) {
38
+ dockerClientConfig.dockerHost = host;
39
+ }
40
+ const tlsVerify = properties.get("docker.tls.verify");
41
+ if (tlsVerify !== null) {
42
+ dockerClientConfig.dockerTlsVerify = `${tlsVerify}`;
43
+ }
44
+ const certPath = properties.get("docker.cert.path");
45
+ if (certPath !== null) {
46
+ dockerClientConfig.dockerCertPath = certPath;
47
+ }
42
48
  }
43
- }
49
+ return dockerClientConfig;
50
+ });
51
+ }
52
+ function loadFromEnv(env) {
53
+ const dockerClientConfig = {};
44
54
  if (env["DOCKER_HOST"] !== undefined) {
45
- dockerHost = env["DOCKER_HOST"];
55
+ dockerClientConfig.dockerHost = env["DOCKER_HOST"];
46
56
  }
47
57
  if (env["DOCKER_TLS_VERIFY"] !== undefined) {
48
- dockerTlsVerify = env["DOCKER_TLS_VERIFY"];
58
+ dockerClientConfig.dockerTlsVerify = env["DOCKER_TLS_VERIFY"];
49
59
  }
50
60
  if (env["DOCKER_CERT_PATH"] !== undefined) {
51
- dockerCertPath = env["DOCKER_CERT_PATH"];
52
- }
53
- let logStr = "Loaded properties: ";
54
- if (dockerHost !== undefined) {
55
- logStr += `dockerHost=${dockerHost}, `;
56
- }
57
- if (dockerTlsVerify !== undefined) {
58
- logStr += `dockerTlsVerify=${dockerTlsVerify}, `;
61
+ dockerClientConfig.dockerCertPath = env["DOCKER_CERT_PATH"];
59
62
  }
60
- if (dockerCertPath !== undefined) {
61
- logStr += `dockerCertPath=${dockerCertPath}`;
63
+ return dockerClientConfig;
64
+ }
65
+ function logDockerClientConfig(config) {
66
+ const configurations = Object.entries(config)
67
+ .filter(([, value]) => value !== undefined)
68
+ .map(([key, value]) => `${key}: "${value}"`);
69
+ if (configurations.length > 0) {
70
+ logger_1.log.debug(`Loaded Docker client configuration, ${configurations.join(", ")}`);
62
71
  }
63
- logger_1.log.debug(logStr);
64
- return { dockerHost, dockerTlsVerify, dockerCertPath };
65
- });
66
- exports.getDockerClientConfig = getDockerClientConfig;
72
+ }
@@ -38,15 +38,15 @@ const getDockerClient = () => __awaiter(void 0, void 0, void 0, function* () {
38
38
  yield strategy.init();
39
39
  }
40
40
  if (strategy.isApplicable()) {
41
- logger_1.log.debug(`Found applicable Docker client strategy: ${strategy.getName()}`);
41
+ logger_1.log.debug(`Found Docker client strategy "${strategy.getName()}"`);
42
42
  const { uri, dockerode, composeEnvironment } = yield strategy.getDockerClient();
43
- logger_1.log.debug(`Testing Docker client strategy URI: ${uri}`);
43
+ logger_1.log.debug(`Testing Docker client strategy "${uri}"...`);
44
44
  if (yield isDockerDaemonReachable(dockerode)) {
45
45
  const indexServerAddress = (yield (0, system_info_1.getSystemInfo)(dockerode)).dockerInfo.indexServerAddress;
46
46
  const provider = uri.includes("podman.sock") ? "podman" : "docker";
47
47
  const host = yield (0, resolve_host_1.resolveHost)(dockerode, provider, indexServerAddress, uri);
48
48
  const hostIps = yield (0, lookup_host_ips_1.lookupHostIps)(host);
49
- logger_1.log.info(`Using Docker client strategy: ${strategy.getName()}, Docker host: ${host} (${hostIps
49
+ logger_1.log.info(`Using Docker client strategy "${strategy.getName()}", Docker host "${host}" (${hostIps
50
50
  .map((hostIp) => hostIp.address)
51
51
  .join(", ")})`);
52
52
  return { uri, provider, host, hostIps, dockerode, indexServerAddress, composeEnvironment };
@@ -18,7 +18,7 @@ const attachContainer = (dockerode, container) => __awaiter(void 0, void 0, void
18
18
  return (0, demux_stream_1.demuxStream)(dockerode, stream);
19
19
  }
20
20
  catch (err) {
21
- logger_1.log.error(`Failed to attach to container ${container.id}: ${err}`);
21
+ logger_1.log.error(`Failed to attach to container: ${err}`, { containerId: container.id });
22
22
  throw err;
23
23
  }
24
24
  });
@@ -17,9 +17,9 @@ const create_labels_1 = require("../create-labels");
17
17
  const createContainer = (options) => __awaiter(void 0, void 0, void 0, function* () {
18
18
  var _a, _b;
19
19
  try {
20
- logger_1.log.info(`Creating container for image: ${options.imageName}`);
20
+ logger_1.log.info(`Creating container for image "${options.imageName}"...`);
21
21
  const { dockerode } = yield (0, docker_client_1.dockerClient)();
22
- return yield dockerode.createContainer({
22
+ const container = yield dockerode.createContainer({
23
23
  name: options.name,
24
24
  User: options.user,
25
25
  Image: options.imageName.toString(),
@@ -47,9 +47,11 @@ const createContainer = (options) => __awaiter(void 0, void 0, void 0, function*
47
47
  NanoCpus: (_b = options.resourcesQuota) === null || _b === void 0 ? void 0 : _b.cpu,
48
48
  },
49
49
  });
50
+ logger_1.log.info(`Created container for image "${options.imageName}"`, { containerId: container.id });
51
+ return container;
50
52
  }
51
53
  catch (err) {
52
- logger_1.log.error(`Failed to create container for image ${options.imageName}: ${err}`);
54
+ logger_1.log.error(`Failed to create container for image "${options.imageName}": ${err}`);
53
55
  throw err;
54
56
  }
55
57
  });
@@ -72,7 +74,7 @@ const getPortBindings = (exposedPorts) => {
72
74
  dockerodePortBindings[exposedPort.container] = [{ HostPort: exposedPort.host.toString() }];
73
75
  }
74
76
  else {
75
- dockerodePortBindings[exposedPort] = [{ HostPort: "0" }];
77
+ dockerodePortBindings[exposedPort] = [{ HostPort: "" }];
76
78
  }
77
79
  }
78
80
  return dockerodePortBindings;
@@ -24,22 +24,24 @@ 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, provider, 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, provider, 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
47
  if (provider === "podman") {
@@ -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
  });
@@ -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
  });
@@ -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
  }
@@ -23,7 +23,7 @@ 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) => {
@@ -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}`);
@@ -24,13 +24,13 @@ const pullImage = (dockerode, indexServerAddress, options) => __awaiter(void 0,
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
+ yield new pull_stream_parser_1.PullStreamParser(options.imageName, logger_1.pullLog).consume(stream);
34
34
  }));
35
35
  }
36
36
  catch (err) {
@@ -14,13 +14,14 @@ const logger_1 = require("../../../logger");
14
14
  const docker_client_1 = require("../../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}`);
17
+ logger_1.log.info(`Connecting to network "${options.networkId}"...`, { containerId: options.containerId });
18
18
  const { dockerode } = yield (0, docker_client_1.dockerClient)();
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
  });
@@ -15,7 +15,7 @@ const docker_client_1 = require("../../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}`);
18
+ logger_1.log.info(`Creating network "${options.name}"...`);
19
19
  const { dockerode } = yield (0, docker_client_1.dockerClient)();
20
20
  const network = yield dockerode.createNetwork({
21
21
  Name: options.name,
@@ -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) {
@@ -14,16 +14,17 @@ const logger_1 = require("../../../logger");
14
14
  const docker_client_1 = require("../../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}`);
17
+ logger_1.log.info(`Removing network "${id}"...`);
18
18
  const { dockerode } = yield (0, docker_client_1.dockerClient)();
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
  });
@@ -12,7 +12,11 @@ class PullStreamParser {
12
12
  }
13
13
  consume(stream) {
14
14
  return new Promise((resolve) => {
15
- (0, byline_1.default)(stream).on("data", (line) => this.logger.trace(`Pulling ${this.dockerImageName.toString()}: ${line}`));
15
+ (0, byline_1.default)(stream).on("data", (line) => {
16
+ if (this.logger.enabled()) {
17
+ this.logger.trace(line, { imageName: this.dockerImageName.toString() });
18
+ }
19
+ });
16
20
  stream.on("end", resolve);
17
21
  });
18
22
  }
@@ -46,12 +46,12 @@ const resolveHost = (dockerode, provider, indexServerAddress, uri, env = process
46
46
  exports.resolveHost = resolveHost;
47
47
  const findGateway = (dockerode, networkName) => __awaiter(void 0, void 0, void 0, function* () {
48
48
  var _a, _b, _c;
49
- logger_1.log.debug(`Checking gateway for Docker host`);
49
+ logger_1.log.debug(`Checking gateway for Docker host...`);
50
50
  const inspectResult = yield dockerode.getNetwork(networkName).inspect();
51
51
  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
52
  });
53
53
  const findDefaultGateway = (dockerode, indexServerAddress) => __awaiter(void 0, void 0, void 0, function* () {
54
- logger_1.log.debug(`Checking default gateway for Docker host`);
54
+ logger_1.log.debug(`Checking default gateway for Docker host...`);
55
55
  return (0, run_in_container_1.runInContainer)(dockerode, indexServerAddress, "alpine:3.14", [
56
56
  "sh",
57
57
  "-c",
@@ -26,17 +26,19 @@ 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
31
  const { composeEnvironment } = yield (0, docker_client_1.dockerClient)();
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));
@@ -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,7 +104,7 @@ 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]);
@@ -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
  }