testcontainers 9.10.1 → 9.12.0-beta.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.
- package/dist/package.json +3 -1
- package/dist/src/docker/client/docker-client-types.d.ts +23 -0
- package/dist/src/docker/client/docker-client-types.js +2 -0
- package/dist/src/docker/client/docker-client.d.ts +1 -17
- package/dist/src/docker/client/docker-client.js +54 -23
- package/dist/src/docker/client/strategy/configuration-strategy.d.ts +1 -1
- package/dist/src/docker/client/strategy/configuration-strategy.js +2 -4
- package/dist/src/docker/client/strategy/docker-client-strategy.d.ts +1 -1
- package/dist/src/docker/client/strategy/npipe-socket-strategy.d.ts +1 -1
- package/dist/src/docker/client/strategy/npipe-socket-strategy.js +1 -5
- package/dist/src/docker/client/strategy/rootless-unix-socket-strategy.d.ts +1 -1
- package/dist/src/docker/client/strategy/rootless-unix-socket-strategy.js +1 -2
- package/dist/src/docker/client/strategy/testcontainers-host-strategy.d.ts +1 -1
- package/dist/src/docker/client/strategy/testcontainers-host-strategy.js +2 -7
- package/dist/src/docker/client/strategy/unix-socket-strategy.d.ts +1 -1
- package/dist/src/docker/client/strategy/unix-socket-strategy.js +1 -5
- package/dist/src/docker/functions/container/create-container.d.ts +1 -1
- package/dist/src/docker/functions/container/create-container.js +2 -2
- package/dist/src/docker/functions/create-labels.d.ts +1 -2
- package/dist/src/docker/functions/create-labels.js +2 -3
- package/dist/src/docker/functions/image/build-image.d.ts +2 -1
- package/dist/src/docker/functions/image/build-image.js +2 -2
- package/dist/src/docker/functions/network/create-network.d.ts +1 -1
- package/dist/src/docker/functions/network/create-network.js +2 -2
- package/dist/src/docker/remote-docker-unix-socket-path.d.ts +2 -2
- package/dist/src/docker/types.d.ts +3 -0
- package/dist/src/docker-compose/docker-compose-client.d.ts +9 -0
- package/dist/src/docker-compose/docker-compose-client.js +221 -0
- package/dist/src/docker-compose/docker-compose-options.d.ts +6 -0
- package/dist/src/docker-compose/docker-compose-options.js +49 -0
- package/dist/src/docker-compose-environment/docker-compose-environment.js +8 -9
- package/dist/src/docker-compose-environment/started-docker-compose-environment.d.ts +1 -2
- package/dist/src/docker-compose-environment/started-docker-compose-environment.js +5 -4
- package/dist/src/docker-compose-environment/stopped-docker-compose-environment.d.ts +1 -2
- package/dist/src/docker-compose-environment/stopped-docker-compose-environment.js +3 -2
- package/dist/src/file-lock.d.ts +1 -0
- package/dist/src/file-lock.js +47 -0
- package/dist/src/generic-container/generic-container-builder.d.ts +4 -1
- package/dist/src/generic-container/generic-container-builder.js +4 -5
- package/dist/src/generic-container/generic-container.d.ts +8 -4
- package/dist/src/generic-container/generic-container.js +75 -72
- package/dist/src/generic-container/started-generic-container.d.ts +2 -1
- package/dist/src/generic-container/started-generic-container.js +10 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/modules/abstract-started-container.d.ts +2 -1
- package/dist/src/modules/abstract-started-container.js +5 -0
- package/dist/src/modules/selenium/selenium-container.js +11 -8
- package/dist/src/network.js +3 -3
- package/dist/src/port-forwarder.js +2 -2
- package/dist/src/reaper.d.ts +5 -14
- package/dist/src/reaper.js +124 -114
- package/dist/src/system-info.d.ts +2 -0
- package/dist/src/system-info.js +38 -6
- package/dist/src/test-container.d.ts +3 -5
- package/dist/src/wait-strategy/composite-wait-strategy.js +4 -1
- package/dist/src/wait-strategy/health-check-wait-strategy.js +1 -0
- package/dist/src/wait-strategy/host-port-wait-strategy.js +1 -0
- package/dist/src/wait-strategy/http-wait-strategy.js +1 -0
- package/dist/src/wait-strategy/log-wait-strategy.js +1 -0
- package/dist/src/wait-strategy/shell-wait-strategy.js +1 -0
- package/package.json +3 -1
- package/dist/src/docker/session-id.d.ts +0 -1
- package/dist/src/docker/session-id.js +0 -5
- package/dist/src/docker-compose/default-docker-compose-options.d.ts +0 -3
- package/dist/src/docker-compose/default-docker-compose-options.js +0 -51
- package/dist/src/docker-compose/functions/docker-compose-down.d.ts +0 -3
- package/dist/src/docker-compose/functions/docker-compose-down.js +0 -39
- package/dist/src/docker-compose/functions/docker-compose-pull.d.ts +0 -2
- package/dist/src/docker-compose/functions/docker-compose-pull.js +0 -35
- package/dist/src/docker-compose/functions/docker-compose-stop.d.ts +0 -2
- package/dist/src/docker-compose/functions/docker-compose-stop.js +0 -29
- package/dist/src/docker-compose/functions/docker-compose-up.d.ts +0 -2
- package/dist/src/docker-compose/functions/docker-compose-up.js +0 -41
- /package/dist/src/docker-compose/{functions/container-name-resolver.d.ts → container-name-resolver.d.ts} +0 -0
- /package/dist/src/docker-compose/{functions/container-name-resolver.js → container-name-resolver.js} +0 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.getDockerComposeClient = void 0;
|
|
36
|
+
const logger_1 = require("../logger");
|
|
37
|
+
const docker_compose_1 = __importStar(require("docker-compose"));
|
|
38
|
+
const docker_compose_options_1 = require("./docker-compose-options");
|
|
39
|
+
function getDockerComposeClient(compat) {
|
|
40
|
+
switch (compat) {
|
|
41
|
+
case undefined:
|
|
42
|
+
return new MissingDockerComposeClient();
|
|
43
|
+
case "v1":
|
|
44
|
+
return new DockerComposeV1Client();
|
|
45
|
+
case "v2":
|
|
46
|
+
return new DockerComposeV2Client();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.getDockerComposeClient = getDockerComposeClient;
|
|
50
|
+
class DockerComposeV1Client {
|
|
51
|
+
up(options, services) {
|
|
52
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
+
try {
|
|
54
|
+
if (services) {
|
|
55
|
+
logger_1.log.info(`Upping DockerCompose environment services ${services.join(", ")}...`);
|
|
56
|
+
yield docker_compose_1.default.upMany(services, yield (0, docker_compose_options_1.defaultDockerComposeOptions)(options));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
logger_1.log.info(`Upping DockerCompose environment...`);
|
|
60
|
+
yield docker_compose_1.default.upAll(yield (0, docker_compose_options_1.defaultDockerComposeOptions)(options));
|
|
61
|
+
}
|
|
62
|
+
logger_1.log.info(`Upped DockerCompose environment`);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
yield handleAndRethrow(err, (error) => __awaiter(this, void 0, void 0, function* () {
|
|
66
|
+
try {
|
|
67
|
+
logger_1.log.error(`Failed to up DockerCompose environment: ${error.message}`);
|
|
68
|
+
yield this.down(options, { removeVolumes: true, timeout: 0 });
|
|
69
|
+
}
|
|
70
|
+
catch (_a) {
|
|
71
|
+
logger_1.log.error(`Failed to down DockerCompose environment after failed up`);
|
|
72
|
+
}
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
pull(options, services) {
|
|
78
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
try {
|
|
80
|
+
if (services) {
|
|
81
|
+
logger_1.log.info(`Pulling DockerCompose environment images "${services.join('", "')}"...`);
|
|
82
|
+
yield docker_compose_1.default.pullMany(services, yield (0, docker_compose_options_1.defaultDockerComposeOptions)(Object.assign(Object.assign({}, options), { logger: logger_1.pullLog })));
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
logger_1.log.info(`Pulling DockerCompose environment images...`);
|
|
86
|
+
yield docker_compose_1.default.pullAll(yield (0, docker_compose_options_1.defaultDockerComposeOptions)(Object.assign(Object.assign({}, options), { logger: logger_1.pullLog })));
|
|
87
|
+
}
|
|
88
|
+
logger_1.log.info(`Pulled DockerCompose environment`);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
yield handleAndRethrow(err, (error) => __awaiter(this, void 0, void 0, function* () { return logger_1.log.error(`Failed to pull DockerCompose environment images: ${error.message}`); }));
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
stop(options) {
|
|
96
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
97
|
+
try {
|
|
98
|
+
logger_1.log.info(`Stopping DockerCompose environment...`);
|
|
99
|
+
yield docker_compose_1.default.stop(yield (0, docker_compose_options_1.defaultDockerComposeOptions)(options));
|
|
100
|
+
logger_1.log.info(`Stopped DockerCompose environment`);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
yield handleAndRethrow(err, (error) => __awaiter(this, void 0, void 0, function* () { return logger_1.log.error(`Failed to stop DockerCompose environment: ${error.message}`); }));
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
down(options, downOptions) {
|
|
108
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
109
|
+
try {
|
|
110
|
+
logger_1.log.info(`Downing DockerCompose environment...`);
|
|
111
|
+
yield docker_compose_1.default.down(Object.assign(Object.assign({}, (yield (0, docker_compose_options_1.defaultDockerComposeOptions)(options))), { commandOptions: dockerComposeDownCommandOptions(downOptions) }));
|
|
112
|
+
logger_1.log.info(`Downed DockerCompose environment`);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
yield handleAndRethrow(err, (error) => __awaiter(this, void 0, void 0, function* () { return logger_1.log.error(`Failed to down DockerCompose environment: ${error.message}`); }));
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
class DockerComposeV2Client {
|
|
121
|
+
up(options, services) {
|
|
122
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
123
|
+
try {
|
|
124
|
+
if (services) {
|
|
125
|
+
logger_1.log.info(`Upping DockerCompose environment services ${services.join(", ")}...`);
|
|
126
|
+
yield docker_compose_1.v2.upMany(services, yield (0, docker_compose_options_1.defaultDockerComposeOptions)(options));
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
logger_1.log.info(`Upping DockerCompose environment...`);
|
|
130
|
+
yield docker_compose_1.v2.upAll(yield (0, docker_compose_options_1.defaultDockerComposeOptions)(options));
|
|
131
|
+
}
|
|
132
|
+
logger_1.log.info(`Upped DockerCompose environment`);
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
yield handleAndRethrow(err, (error) => __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
try {
|
|
137
|
+
logger_1.log.error(`Failed to up DockerCompose environment: ${error.message}`);
|
|
138
|
+
yield this.down(options, { removeVolumes: true, timeout: 0 });
|
|
139
|
+
}
|
|
140
|
+
catch (_a) {
|
|
141
|
+
logger_1.log.error(`Failed to down DockerCompose environment after failed up`);
|
|
142
|
+
}
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
pull(options, services) {
|
|
148
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
149
|
+
try {
|
|
150
|
+
if (services) {
|
|
151
|
+
logger_1.log.info(`Pulling DockerCompose environment images "${services.join('", "')}"...`);
|
|
152
|
+
yield docker_compose_1.v2.pullMany(services, yield (0, docker_compose_options_1.defaultDockerComposeOptions)(Object.assign(Object.assign({}, options), { logger: logger_1.pullLog })));
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
logger_1.log.info(`Pulling DockerCompose environment images...`);
|
|
156
|
+
yield docker_compose_1.v2.pullAll(yield (0, docker_compose_options_1.defaultDockerComposeOptions)(Object.assign(Object.assign({}, options), { logger: logger_1.pullLog })));
|
|
157
|
+
}
|
|
158
|
+
logger_1.log.info(`Pulled DockerCompose environment`);
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
yield handleAndRethrow(err, (error) => __awaiter(this, void 0, void 0, function* () { return logger_1.log.error(`Failed to pull DockerCompose environment images: ${error.message}`); }));
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
stop(options) {
|
|
166
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
167
|
+
try {
|
|
168
|
+
logger_1.log.info(`Stopping DockerCompose environment...`);
|
|
169
|
+
yield docker_compose_1.v2.stop(yield (0, docker_compose_options_1.defaultDockerComposeOptions)(options));
|
|
170
|
+
logger_1.log.info(`Stopped DockerCompose environment`);
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
yield handleAndRethrow(err, (error) => __awaiter(this, void 0, void 0, function* () { return logger_1.log.error(`Failed to stop DockerCompose environment: ${error.message}`); }));
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
down(options, downOptions) {
|
|
178
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
179
|
+
try {
|
|
180
|
+
logger_1.log.info(`Downing DockerCompose environment...`);
|
|
181
|
+
yield docker_compose_1.v2.down(Object.assign(Object.assign({}, (yield (0, docker_compose_options_1.defaultDockerComposeOptions)(options))), { commandOptions: dockerComposeDownCommandOptions(downOptions) }));
|
|
182
|
+
logger_1.log.info(`Downed DockerCompose environment`);
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
yield handleAndRethrow(err, (error) => __awaiter(this, void 0, void 0, function* () { return logger_1.log.error(`Failed to down DockerCompose environment: ${error.message}`); }));
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
class MissingDockerComposeClient {
|
|
191
|
+
up() {
|
|
192
|
+
throw new Error("DockerCompose is not installed");
|
|
193
|
+
}
|
|
194
|
+
pull() {
|
|
195
|
+
throw new Error("DockerCompose is not installed");
|
|
196
|
+
}
|
|
197
|
+
stop() {
|
|
198
|
+
throw new Error("DockerCompose is not installed");
|
|
199
|
+
}
|
|
200
|
+
down() {
|
|
201
|
+
throw new Error("DockerCompose is not installed");
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
205
|
+
function handleAndRethrow(err, handle) {
|
|
206
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
207
|
+
const error = err instanceof Error ? err : new Error(err.err.trim());
|
|
208
|
+
yield handle(error);
|
|
209
|
+
throw error;
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
function dockerComposeDownCommandOptions(options) {
|
|
213
|
+
const result = [];
|
|
214
|
+
if (options.removeVolumes) {
|
|
215
|
+
result.push("-v");
|
|
216
|
+
}
|
|
217
|
+
if (options.timeout) {
|
|
218
|
+
result.push("-t", `${options.timeout / 1000}`);
|
|
219
|
+
}
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Environment } from "../docker/types";
|
|
2
2
|
import { Logger } from "../logger";
|
|
3
|
+
import { IDockerComposeOptions } from "docker-compose";
|
|
3
4
|
export type DockerComposeOptions = {
|
|
4
5
|
filePath: string;
|
|
5
6
|
files: string | string[];
|
|
@@ -9,3 +10,8 @@ export type DockerComposeOptions = {
|
|
|
9
10
|
environment?: Environment;
|
|
10
11
|
logger?: Logger;
|
|
11
12
|
};
|
|
13
|
+
export declare const defaultDockerComposeOptions: ({ environment, ...options }: DockerComposeOptions) => Promise<Partial<IDockerComposeOptions>>;
|
|
14
|
+
export type DockerComposeDownOptions = {
|
|
15
|
+
timeout: number;
|
|
16
|
+
removeVolumes: boolean;
|
|
17
|
+
};
|
|
@@ -1,2 +1,51 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
12
|
+
var t = {};
|
|
13
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
14
|
+
t[p] = s[p];
|
|
15
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
16
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
17
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
18
|
+
t[p[i]] = s[p[i]];
|
|
19
|
+
}
|
|
20
|
+
return t;
|
|
21
|
+
};
|
|
2
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.defaultDockerComposeOptions = void 0;
|
|
24
|
+
const logger_1 = require("../logger");
|
|
25
|
+
const docker_client_1 = require("../docker/client/docker-client");
|
|
26
|
+
const os_1 = require("os");
|
|
27
|
+
const type_guards_1 = require("../type-guards");
|
|
28
|
+
const defaultDockerComposeOptions = (_a) => __awaiter(void 0, void 0, void 0, function* () {
|
|
29
|
+
var _b;
|
|
30
|
+
var { environment = {} } = _a, options = __rest(_a, ["environment"]);
|
|
31
|
+
const { composeEnvironment } = yield (0, docker_client_1.getDockerClient)();
|
|
32
|
+
const log = (_b = options.logger) !== null && _b !== void 0 ? _b : logger_1.composeLog;
|
|
33
|
+
return {
|
|
34
|
+
log: false,
|
|
35
|
+
callback: log.enabled()
|
|
36
|
+
? (chunk) => {
|
|
37
|
+
chunk
|
|
38
|
+
.toString()
|
|
39
|
+
.split(os_1.EOL)
|
|
40
|
+
.filter(type_guards_1.isNotEmptyString)
|
|
41
|
+
.forEach((line) => log.trace(line.trim()));
|
|
42
|
+
}
|
|
43
|
+
: undefined,
|
|
44
|
+
cwd: options.filePath,
|
|
45
|
+
config: options.files,
|
|
46
|
+
composeOptions: options.composeOptions,
|
|
47
|
+
commandOptions: options.commandOptions,
|
|
48
|
+
env: Object.assign(Object.assign(Object.assign(Object.assign({}, process.env), { COMPOSE_PROJECT_NAME: options.projectName }), composeEnvironment), environment),
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
exports.defaultDockerComposeOptions = defaultDockerComposeOptions;
|
|
@@ -11,10 +11,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.DockerComposeEnvironment = void 0;
|
|
13
13
|
const bound_ports_1 = require("../bound-ports");
|
|
14
|
-
const container_name_resolver_1 = require("../docker-compose/
|
|
14
|
+
const container_name_resolver_1 = require("../docker-compose/container-name-resolver");
|
|
15
15
|
const started_generic_container_1 = require("../generic-container/started-generic-container");
|
|
16
16
|
const logger_1 = require("../logger");
|
|
17
|
-
const reaper_1 = require("../reaper");
|
|
18
17
|
const uuid_1 = require("../uuid");
|
|
19
18
|
const list_containers_1 = require("../docker/functions/container/list-containers");
|
|
20
19
|
const get_container_1 = require("../docker/functions/container/get-container");
|
|
@@ -22,12 +21,10 @@ const docker_client_1 = require("../docker/client/docker-client");
|
|
|
22
21
|
const inspect_container_1 = require("../docker/functions/container/inspect-container");
|
|
23
22
|
const container_logs_1 = require("../docker/functions/container/container-logs");
|
|
24
23
|
const started_docker_compose_environment_1 = require("./started-docker-compose-environment");
|
|
25
|
-
const docker_compose_down_1 = require("../docker-compose/functions/docker-compose-down");
|
|
26
|
-
const docker_compose_up_1 = require("../docker-compose/functions/docker-compose-up");
|
|
27
24
|
const wait_for_container_1 = require("../wait-for-container");
|
|
28
25
|
const pull_policy_1 = require("../pull-policy");
|
|
29
|
-
const docker_compose_pull_1 = require("../docker-compose/functions/docker-compose-pull");
|
|
30
26
|
const wait_1 = require("../wait-strategy/wait");
|
|
27
|
+
const reaper_1 = require("../reaper");
|
|
31
28
|
class DockerComposeEnvironment {
|
|
32
29
|
constructor(composeFilePath, composeFiles, uuid = new uuid_1.RandomUuid()) {
|
|
33
30
|
this.build = false;
|
|
@@ -77,7 +74,8 @@ class DockerComposeEnvironment {
|
|
|
77
74
|
up(services) {
|
|
78
75
|
return __awaiter(this, void 0, void 0, function* () {
|
|
79
76
|
logger_1.log.info(`Starting DockerCompose environment "${this.projectName}"...`);
|
|
80
|
-
|
|
77
|
+
const { dockerComposeClient } = yield (0, docker_client_1.getDockerClient)();
|
|
78
|
+
yield (0, reaper_1.registerComposeProjectForCleanup)(this.projectName);
|
|
81
79
|
const options = {
|
|
82
80
|
filePath: this.composeFilePath,
|
|
83
81
|
files: this.composeFiles,
|
|
@@ -96,9 +94,10 @@ class DockerComposeEnvironment {
|
|
|
96
94
|
}
|
|
97
95
|
this.profiles.forEach((profile) => composeOptions.push("--profile", profile));
|
|
98
96
|
if (this.pullPolicy.shouldPull()) {
|
|
99
|
-
yield
|
|
97
|
+
yield dockerComposeClient.pull(options, services);
|
|
100
98
|
}
|
|
101
|
-
yield
|
|
99
|
+
yield dockerComposeClient.up(Object.assign(Object.assign({}, options), { commandOptions,
|
|
100
|
+
composeOptions, environment: this.environment }), services);
|
|
102
101
|
const startedContainers = (yield (0, list_containers_1.listContainers)()).filter((container) => container.Labels["com.docker.compose.project"] === this.projectName);
|
|
103
102
|
const startedContainerNames = startedContainers.reduce((containerNames, startedContainer) => [
|
|
104
103
|
...containerNames,
|
|
@@ -127,7 +126,7 @@ class DockerComposeEnvironment {
|
|
|
127
126
|
}
|
|
128
127
|
catch (err) {
|
|
129
128
|
try {
|
|
130
|
-
yield
|
|
129
|
+
yield dockerComposeClient.down(options, { removeVolumes: true, timeout: 0 });
|
|
131
130
|
}
|
|
132
131
|
catch (_a) {
|
|
133
132
|
logger_1.log.warn(`Failed to stop DockerCompose environment after failed up`);
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { StartedGenericContainer } from "../generic-container/started-generic-container";
|
|
2
2
|
import { StoppedDockerComposeEnvironment } from "./stopped-docker-compose-environment";
|
|
3
3
|
import { DownedDockerComposeEnvironment } from "./downed-docker-compose-environment";
|
|
4
|
-
import { DockerComposeOptions } from "../docker-compose/docker-compose-options";
|
|
5
|
-
import { DockerComposeDownOptions } from "../test-container";
|
|
4
|
+
import { DockerComposeDownOptions, DockerComposeOptions } from "../docker-compose/docker-compose-options";
|
|
6
5
|
export declare class StartedDockerComposeEnvironment {
|
|
7
6
|
private readonly startedGenericContainers;
|
|
8
7
|
private readonly options;
|
|
@@ -11,10 +11,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.StartedDockerComposeEnvironment = void 0;
|
|
13
13
|
const logger_1 = require("../logger");
|
|
14
|
-
const docker_compose_down_1 = require("../docker-compose/functions/docker-compose-down");
|
|
15
|
-
const docker_compose_stop_1 = require("../docker-compose/functions/docker-compose-stop");
|
|
16
14
|
const stopped_docker_compose_environment_1 = require("./stopped-docker-compose-environment");
|
|
17
15
|
const downed_docker_compose_environment_1 = require("./downed-docker-compose-environment");
|
|
16
|
+
const docker_client_1 = require("../docker/client/docker-client");
|
|
18
17
|
class StartedDockerComposeEnvironment {
|
|
19
18
|
constructor(startedGenericContainers, options) {
|
|
20
19
|
this.startedGenericContainers = startedGenericContainers;
|
|
@@ -22,14 +21,16 @@ class StartedDockerComposeEnvironment {
|
|
|
22
21
|
}
|
|
23
22
|
stop() {
|
|
24
23
|
return __awaiter(this, void 0, void 0, function* () {
|
|
25
|
-
yield (0,
|
|
24
|
+
const { dockerComposeClient } = yield (0, docker_client_1.getDockerClient)();
|
|
25
|
+
yield dockerComposeClient.stop(this.options);
|
|
26
26
|
return new stopped_docker_compose_environment_1.StoppedDockerComposeEnvironment(this.options);
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
29
|
down(options = {}) {
|
|
30
30
|
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
+
const { dockerComposeClient } = yield (0, docker_client_1.getDockerClient)();
|
|
31
32
|
const downOptions = Object.assign({ timeout: 0, removeVolumes: true }, options);
|
|
32
|
-
yield
|
|
33
|
+
yield dockerComposeClient.down(this.options, downOptions);
|
|
33
34
|
return new downed_docker_compose_environment_1.DownedDockerComposeEnvironment();
|
|
34
35
|
});
|
|
35
36
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { DownedDockerComposeEnvironment } from "./downed-docker-compose-environment";
|
|
2
|
-
import { DockerComposeOptions } from "../docker-compose/docker-compose-options";
|
|
3
|
-
import { DockerComposeDownOptions } from "../test-container";
|
|
2
|
+
import { DockerComposeDownOptions, DockerComposeOptions } from "../docker-compose/docker-compose-options";
|
|
4
3
|
export declare class StoppedDockerComposeEnvironment {
|
|
5
4
|
private readonly options;
|
|
6
5
|
constructor(options: DockerComposeOptions);
|
|
@@ -10,16 +10,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.StoppedDockerComposeEnvironment = void 0;
|
|
13
|
-
const docker_compose_down_1 = require("../docker-compose/functions/docker-compose-down");
|
|
14
13
|
const downed_docker_compose_environment_1 = require("./downed-docker-compose-environment");
|
|
14
|
+
const docker_client_1 = require("../docker/client/docker-client");
|
|
15
15
|
class StoppedDockerComposeEnvironment {
|
|
16
16
|
constructor(options) {
|
|
17
17
|
this.options = options;
|
|
18
18
|
}
|
|
19
19
|
down(options = {}) {
|
|
20
20
|
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
+
const { dockerComposeClient } = yield (0, docker_client_1.getDockerClient)();
|
|
21
22
|
const resolvedOptions = Object.assign({ timeout: 0, removeVolumes: true }, options);
|
|
22
|
-
yield
|
|
23
|
+
yield dockerComposeClient.down(this.options, resolvedOptions);
|
|
23
24
|
return new downed_docker_compose_environment_1.DownedDockerComposeEnvironment();
|
|
24
25
|
});
|
|
25
26
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function withFileLock<T>(fileName: string, fn: () => T): Promise<T>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.withFileLock = void 0;
|
|
16
|
+
const path_1 = __importDefault(require("path"));
|
|
17
|
+
const tmp_1 = __importDefault(require("tmp"));
|
|
18
|
+
const promises_1 = require("fs/promises");
|
|
19
|
+
const logger_1 = require("./logger");
|
|
20
|
+
const proper_lockfile_1 = __importDefault(require("proper-lockfile"));
|
|
21
|
+
function withFileLock(fileName, fn) {
|
|
22
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
23
|
+
const file = yield createEmptyTmpFile(fileName);
|
|
24
|
+
let releaseLockFn;
|
|
25
|
+
try {
|
|
26
|
+
logger_1.log.debug(`Acquiring lock file "${file}"...`);
|
|
27
|
+
releaseLockFn = yield proper_lockfile_1.default.lock(file, { retries: { forever: true } });
|
|
28
|
+
logger_1.log.debug(`Acquired lock file "${file}"`);
|
|
29
|
+
return yield fn();
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
if (releaseLockFn) {
|
|
33
|
+
logger_1.log.debug(`Releasing lock file "${file}"...`);
|
|
34
|
+
yield releaseLockFn();
|
|
35
|
+
logger_1.log.debug(`Released lock file "${file}"`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
exports.withFileLock = withFileLock;
|
|
41
|
+
function createEmptyTmpFile(fileName) {
|
|
42
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
+
const file = path_1.default.resolve(tmp_1.default.tmpdir, fileName);
|
|
44
|
+
yield (0, promises_1.writeFile)(file, "");
|
|
45
|
+
return file;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
@@ -2,6 +2,9 @@ import { BuildArgs } from "../docker/types";
|
|
|
2
2
|
import { PullPolicy } from "../pull-policy";
|
|
3
3
|
import { Uuid } from "../uuid";
|
|
4
4
|
import { GenericContainer } from "./generic-container";
|
|
5
|
+
export type BuildOptions = {
|
|
6
|
+
deleteOnExit: boolean;
|
|
7
|
+
};
|
|
5
8
|
export declare class GenericContainerBuilder {
|
|
6
9
|
private readonly context;
|
|
7
10
|
private readonly dockerfileName;
|
|
@@ -13,6 +16,6 @@ export declare class GenericContainerBuilder {
|
|
|
13
16
|
withBuildArgs(buildArgs: BuildArgs): GenericContainerBuilder;
|
|
14
17
|
withPullPolicy(pullPolicy: PullPolicy): this;
|
|
15
18
|
withCache(cache: boolean): this;
|
|
16
|
-
build(image?: string): Promise<GenericContainer>;
|
|
19
|
+
build(image?: string, options?: BuildOptions): Promise<GenericContainer>;
|
|
17
20
|
private getRegistryConfig;
|
|
18
21
|
}
|
|
@@ -15,7 +15,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.GenericContainerBuilder = void 0;
|
|
16
16
|
const pull_policy_1 = require("../pull-policy");
|
|
17
17
|
const uuid_1 = require("../uuid");
|
|
18
|
-
const reaper_1 = require("../reaper");
|
|
19
18
|
const docker_image_name_1 = require("../docker-image-name");
|
|
20
19
|
const path_1 = __importDefault(require("path"));
|
|
21
20
|
const logger_1 = require("../logger");
|
|
@@ -46,23 +45,23 @@ class GenericContainerBuilder {
|
|
|
46
45
|
this.cache = cache;
|
|
47
46
|
return this;
|
|
48
47
|
}
|
|
49
|
-
|
|
50
|
-
build(image = `localhost/${this.uuid.nextUuid()}:${this.uuid.nextUuid()}`) {
|
|
48
|
+
build(image = `localhost/${this.uuid.nextUuid()}:${this.uuid.nextUuid()}`, options = { deleteOnExit: true }) {
|
|
51
49
|
return __awaiter(this, void 0, void 0, function* () {
|
|
52
50
|
const imageName = docker_image_name_1.DockerImageName.fromString(image);
|
|
53
|
-
yield
|
|
51
|
+
const { sessionId } = yield (0, docker_client_1.getDockerClient)();
|
|
54
52
|
const dockerfile = path_1.default.resolve(this.context, this.dockerfileName);
|
|
55
53
|
logger_1.log.debug(`Preparing to build Dockerfile "${dockerfile}" as image "${imageName}"...`);
|
|
56
54
|
const imageNames = yield (0, dockerfile_parser_1.getDockerfileImages)(dockerfile, this.buildArgs);
|
|
57
55
|
const { dockerode, info } = yield (0, docker_client_1.getDockerClient)();
|
|
58
56
|
const registryConfig = yield this.getRegistryConfig(info.dockerInfo.indexServerAddress, imageNames);
|
|
59
|
-
yield (0, build_image_1.buildImage)({
|
|
57
|
+
yield (0, build_image_1.buildImage)(sessionId, {
|
|
60
58
|
imageName: imageName,
|
|
61
59
|
context: this.context,
|
|
62
60
|
dockerfileName: this.dockerfileName,
|
|
63
61
|
buildArgs: this.buildArgs,
|
|
64
62
|
pullPolicy: this.pullPolicy,
|
|
65
63
|
cache: this.cache,
|
|
64
|
+
deleteOnExit: options.deleteOnExit,
|
|
66
65
|
registryConfig,
|
|
67
66
|
});
|
|
68
67
|
const container = new generic_container_1.GenericContainer(imageName.toString());
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import archiver from "archiver";
|
|
3
2
|
import { BoundPorts } from "../bound-ports";
|
|
4
3
|
import { PortWithOptionalBinding } from "../port";
|
|
5
4
|
import { PullPolicy } from "../pull-policy";
|
|
6
5
|
import { StartedTestContainer, TestContainer } from "../test-container";
|
|
7
6
|
import { WaitStrategy } from "../wait-strategy/wait-strategy";
|
|
8
|
-
import { BindMount, ContentToCopy, Environment, ExtraHost, FileToCopy, HealthCheck, Labels, ResourcesQuota, TmpFs, Ulimits } from "../docker/types";
|
|
7
|
+
import { BindMount, ContentToCopy, DirectoryToCopy, Environment, ExtraHost, FileToCopy, HealthCheck, Labels, ResourcesQuota, TmpFs, Ulimits } from "../docker/types";
|
|
9
8
|
import { CreateContainerOptions } from "../docker/functions/container/create-container";
|
|
10
9
|
import { InspectResult } from "../docker/functions/container/inspect-container";
|
|
11
10
|
import { GenericContainerBuilder } from "./generic-container-builder";
|
|
@@ -17,11 +16,13 @@ export declare class GenericContainer implements TestContainer {
|
|
|
17
16
|
protected opts: CreateContainerOptions;
|
|
18
17
|
protected startupTimeout?: number;
|
|
19
18
|
protected waitStrategy: WaitStrategy;
|
|
20
|
-
protected tarToCopy?: archiver.Archiver;
|
|
21
19
|
protected networkMode?: string;
|
|
22
20
|
protected networkAliases: string[];
|
|
23
21
|
protected pullPolicy: PullPolicy;
|
|
24
22
|
protected logConsumer?: (stream: Readable) => unknown;
|
|
23
|
+
protected filesToCopy: FileToCopy[];
|
|
24
|
+
protected directoriesToCopy: DirectoryToCopy[];
|
|
25
|
+
protected contentsToCopy: ContentToCopy[];
|
|
25
26
|
constructor(image: string);
|
|
26
27
|
/**
|
|
27
28
|
* @deprecated Since version 9.4.0. Will be removed in version 10.0.0. Use `beforeContainerStarted` instead.
|
|
@@ -31,8 +32,11 @@ export declare class GenericContainer implements TestContainer {
|
|
|
31
32
|
protected containerCreated?(containerId: string): Promise<void>;
|
|
32
33
|
protected containerStarting?(inspectResult: InspectResult, reused: boolean): Promise<void>;
|
|
33
34
|
start(): Promise<StartedTestContainer>;
|
|
35
|
+
private reuseOrStartContainer;
|
|
34
36
|
private reuseContainer;
|
|
35
37
|
private startContainer;
|
|
38
|
+
private connectContainerToPortForwarder;
|
|
39
|
+
private createArchiveToCopyToContainer;
|
|
36
40
|
/**
|
|
37
41
|
* @deprecated Since version 9.4.0. Will be removed in version 10.0.0. Use `containerStarted` instead.
|
|
38
42
|
*/
|
|
@@ -64,8 +68,8 @@ export declare class GenericContainer implements TestContainer {
|
|
|
64
68
|
withPullPolicy(pullPolicy: PullPolicy): this;
|
|
65
69
|
withIpcMode(ipcMode: string): this;
|
|
66
70
|
withCopyFilesToContainer(filesToCopy: FileToCopy[]): this;
|
|
71
|
+
withCopyDirectoriesToContainer(directoriesToCopy: DirectoryToCopy[]): this;
|
|
67
72
|
withCopyContentToContainer(contentsToCopy: ContentToCopy[]): this;
|
|
68
|
-
protected getTarToCopy(): archiver.Archiver;
|
|
69
73
|
withWorkingDir(workingDir: string): this;
|
|
70
74
|
withResourcesQuota({ memory, cpu }: ResourcesQuota): this;
|
|
71
75
|
withSharedMemorySize(bytes: number): this;
|