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.
- package/dist/package.json +12 -12
- package/dist/src/docker/{docker-client-config.d.ts → client/docker-client-config.d.ts} +1 -0
- package/dist/src/docker/client/docker-client-config.js +79 -0
- package/dist/src/docker/client/docker-client.d.ts +18 -0
- package/dist/src/docker/client/docker-client.js +90 -0
- package/dist/src/docker/client/strategy/configuration-strategy.d.ts +11 -0
- package/dist/src/docker/client/strategy/configuration-strategy.js +68 -0
- package/dist/src/docker/client/strategy/docker-client-strategy.d.ts +7 -0
- package/dist/src/docker/client/strategy/docker-client-strategy.js +2 -0
- package/dist/src/docker/client/strategy/npipe-socket-strategy.d.ts +7 -0
- package/dist/src/docker/client/strategy/npipe-socket-strategy.js +35 -0
- package/dist/src/docker/{rootless-unix-socket-strategy.d.ts → client/strategy/rootless-unix-socket-strategy.d.ts} +3 -2
- package/dist/src/docker/{rootless-unix-socket-strategy.js → client/strategy/rootless-unix-socket-strategy.js} +2 -1
- package/dist/src/docker/client/strategy/testcontainers-host-strategy.d.ts +9 -0
- package/dist/src/docker/client/strategy/testcontainers-host-strategy.js +52 -0
- package/dist/src/docker/client/strategy/unix-socket-strategy.d.ts +7 -0
- package/dist/src/docker/client/strategy/unix-socket-strategy.js +36 -0
- package/dist/src/docker/functions/container/attach-container.js +1 -1
- package/dist/src/docker/functions/container/container-logs.js +2 -2
- package/dist/src/docker/functions/container/create-container.js +8 -6
- package/dist/src/docker/functions/container/exec-container.d.ts +2 -3
- package/dist/src/docker/functions/container/exec-container.js +9 -7
- package/dist/src/docker/functions/container/get-container.js +4 -4
- package/dist/src/docker/functions/container/inspect-container.js +1 -1
- package/dist/src/docker/functions/container/list-containers.js +2 -2
- package/dist/src/docker/functions/container/put-container-archive.js +1 -1
- package/dist/src/docker/functions/container/remove-container.js +1 -1
- package/dist/src/docker/functions/container/restart-container.js +1 -1
- package/dist/src/docker/functions/container/start-container.js +1 -1
- package/dist/src/docker/functions/container/stop-container.js +2 -2
- package/dist/src/docker/functions/create-labels.js +0 -3
- package/dist/src/docker/functions/image/build-image.js +10 -5
- package/dist/src/docker/functions/image/pull-image.js +11 -4
- package/dist/src/docker/functions/network/connect-network.js +5 -4
- package/dist/src/docker/functions/network/create-network.js +4 -3
- package/dist/src/docker/functions/network/remove-network.js +5 -4
- package/dist/src/docker/functions/run-in-container.js +6 -6
- package/dist/src/docker/remote-docker-unix-socket-path.d.ts +6 -0
- package/dist/src/docker/remote-docker-unix-socket-path.js +22 -0
- package/dist/src/docker/resolve-host.d.ts +2 -2
- package/dist/src/docker/resolve-host.js +8 -6
- package/dist/src/docker/types.d.ts +1 -0
- package/dist/src/docker-compose/default-docker-compose-options.js +6 -4
- package/dist/src/docker-compose/docker-compose-options.d.ts +2 -0
- package/dist/src/docker-compose/functions/docker-compose-down.js +1 -1
- package/dist/src/docker-compose/functions/docker-compose-pull.js +4 -4
- package/dist/src/docker-compose/functions/docker-compose-stop.js +1 -1
- package/dist/src/docker-compose/functions/docker-compose-up.js +1 -1
- package/dist/src/docker-compose-environment/docker-compose-environment.js +5 -8
- package/dist/src/generic-container/generic-container-builder.js +4 -4
- package/dist/src/generic-container/generic-container.d.ts +4 -0
- package/dist/src/generic-container/generic-container.js +23 -12
- package/dist/src/generic-container/started-generic-container.js +13 -8
- package/dist/src/images.js +1 -1
- package/dist/src/logger.d.ts +20 -31
- package/dist/src/logger.js +32 -42
- package/dist/src/modules/nats/nats-container.js +1 -1
- package/dist/src/network.js +6 -3
- package/dist/src/port-check.d.ts +3 -3
- package/dist/src/port-check.js +9 -5
- package/dist/src/port-forwarder.js +7 -5
- package/dist/src/reaper.js +16 -10
- package/dist/src/registry-auth-locator/credential-provider.js +3 -5
- package/dist/src/registry-auth-locator/get-auth-config.js +3 -3
- package/dist/src/system-info.js +2 -5
- package/dist/src/test-container.d.ts +1 -0
- package/dist/src/uuid.js +1 -1
- package/dist/src/wait-for-container.js +4 -4
- package/dist/src/wait-strategy/composite-wait-strategy.js +4 -4
- package/dist/src/wait-strategy/health-check-wait-strategy.js +8 -5
- package/dist/src/wait-strategy/host-port-wait-strategy.js +11 -11
- package/dist/src/wait-strategy/http-wait-strategy.js +9 -7
- package/dist/src/wait-strategy/log-wait-strategy.js +7 -7
- package/dist/src/wait-strategy/shell-wait-strategy.js +8 -8
- package/dist/src/wait-strategy/startup-check-strategy.js +8 -5
- package/dist/src/wait-strategy/wait-strategy.d.ts +6 -4
- package/dist/src/wait-strategy/wait-strategy.js +9 -2
- package/package.json +12 -12
- package/dist/src/docker/docker-client-config.js +0 -66
- package/dist/src/docker/docker-client.d.ts +0 -26
- package/dist/src/docker/docker-client.js +0 -156
- package/dist/src/docker/get-remote-docker-unix-socket-path.d.ts +0 -5
- package/dist/src/docker/get-remote-docker-unix-socket-path.js +0 -17
- package/dist/src/docker/pull-stream-parser.d.ts +0 -10
- 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,
|
|
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,
|
|
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(
|
|
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
|
|
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,
|
|
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 (
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
|
|
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) =>
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
18
|
-
const { dockerode } = yield (0, docker_client_1.
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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 {
|
|
7
|
-
export declare const resolveHost: (dockerode: Dockerode,
|
|
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,
|
|
18
|
-
if (
|
|
19
|
-
|
|
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 =
|
|
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",
|
|
@@ -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.
|
|
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:
|
|
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) =>
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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,
|
|
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,
|