@mikeyt23/node-cli-utils 2.0.5 → 2.0.7
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/LICENSE +6 -6
- package/README.md +11 -10
- package/dist/cjs/DependencyChecker.d.ts.map +1 -1
- package/dist/cjs/DependencyChecker.js +3 -2
- package/dist/cjs/NodeCliUtilsConfig.d.ts +3 -7
- package/dist/cjs/NodeCliUtilsConfig.d.ts.map +1 -1
- package/dist/cjs/NodeCliUtilsConfig.js +7 -10
- package/dist/cjs/certUtils.js +22 -22
- package/dist/cjs/dbMigrationUtils.js +21 -21
- package/dist/cjs/dockerUtils.d.ts +164 -0
- package/dist/cjs/dockerUtils.d.ts.map +1 -0
- package/dist/cjs/dockerUtils.js +299 -0
- package/dist/cjs/generalUtils.d.ts +55 -110
- package/dist/cjs/generalUtils.d.ts.map +1 -1
- package/dist/cjs/generalUtils.js +63 -196
- package/dist/cjs/generalUtilsInternal.js +2 -2
- package/dist/cjs/package.json +5 -5
- package/dist/esm/DependencyChecker.d.ts.map +1 -1
- package/dist/esm/DependencyChecker.js +3 -2
- package/dist/esm/NodeCliUtilsConfig.d.ts +3 -7
- package/dist/esm/NodeCliUtilsConfig.d.ts.map +1 -1
- package/dist/esm/NodeCliUtilsConfig.js +7 -10
- package/dist/esm/certUtils.js +22 -22
- package/dist/esm/dbMigrationUtils.js +21 -21
- package/dist/esm/dockerUtils.d.ts +164 -0
- package/dist/esm/dockerUtils.d.ts.map +1 -0
- package/dist/esm/dockerUtils.js +281 -0
- package/dist/esm/generalUtils.d.ts +55 -110
- package/dist/esm/generalUtils.d.ts.map +1 -1
- package/dist/esm/generalUtils.js +60 -190
- package/dist/esm/generalUtilsInternal.js +2 -2
- package/package.json +25 -2
package/dist/esm/certUtils.js
CHANGED
|
@@ -187,13 +187,13 @@ export async function winGetPfxInfo(pfxPath) {
|
|
|
187
187
|
* Does not actually do anything - just outputs the manual instructions for installing a cert for use by chrome on linux.
|
|
188
188
|
*/
|
|
189
189
|
export function linuxInstallCert() {
|
|
190
|
-
const instructions = `Automated linux cert install not supported (chrome does not use system certs without significant extra configuration).
|
|
191
|
-
Manual Instructions:
|
|
192
|
-
- In Chrome, go to chrome://settings/certificates
|
|
193
|
-
- Select Authorities -> import
|
|
194
|
-
- Select your generated .crt file (in the ./cert/ directory by default - if you haven't generated it, see the generateCertWithOpenSsl function)
|
|
195
|
-
- Check box for "Trust certificate for identifying websites"
|
|
196
|
-
- Click OK
|
|
190
|
+
const instructions = `Automated linux cert install not supported (chrome does not use system certs without significant extra configuration).
|
|
191
|
+
Manual Instructions:
|
|
192
|
+
- In Chrome, go to chrome://settings/certificates
|
|
193
|
+
- Select Authorities -> import
|
|
194
|
+
- Select your generated .crt file (in the ./cert/ directory by default - if you haven't generated it, see the generateCertWithOpenSsl function)
|
|
195
|
+
- Check box for "Trust certificate for identifying websites"
|
|
196
|
+
- Click OK
|
|
197
197
|
- Reload site`;
|
|
198
198
|
console.log(instructions);
|
|
199
199
|
}
|
|
@@ -253,20 +253,20 @@ function getRequiresElevatedPermissionsMessage(isInstall = true) {
|
|
|
253
253
|
}
|
|
254
254
|
// Newer cert requirements force the need for "extension info" with DNS and IP info, but openssl v1.x doesn't support that with the
|
|
255
255
|
// CLI option -addext, so we're using a san.cnf file instead and passing this into the CLI command with the -config option.
|
|
256
|
-
const sanCnfTemplate = `[req]
|
|
257
|
-
distinguished_name=req
|
|
258
|
-
x509_extensions = v3_req
|
|
259
|
-
prompt = no
|
|
260
|
-
|
|
261
|
-
[req_distinguished_name]
|
|
262
|
-
CN = {{url}}
|
|
263
|
-
|
|
264
|
-
[v3_req]
|
|
265
|
-
subjectAltName = @alt_names
|
|
266
|
-
|
|
267
|
-
[alt_names]
|
|
268
|
-
DNS.1 = {{url}}
|
|
269
|
-
IP.1 = 127.0.0.1
|
|
270
|
-
|
|
256
|
+
const sanCnfTemplate = `[req]
|
|
257
|
+
distinguished_name=req
|
|
258
|
+
x509_extensions = v3_req
|
|
259
|
+
prompt = no
|
|
260
|
+
|
|
261
|
+
[req_distinguished_name]
|
|
262
|
+
CN = {{url}}
|
|
263
|
+
|
|
264
|
+
[v3_req]
|
|
265
|
+
subjectAltName = @alt_names
|
|
266
|
+
|
|
267
|
+
[alt_names]
|
|
268
|
+
DNS.1 = {{url}}
|
|
269
|
+
IP.1 = 127.0.0.1
|
|
270
|
+
|
|
271
271
|
`;
|
|
272
272
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydFV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NlcnRVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDeEIsT0FBTyxHQUFHLE1BQU0sa0JBQWtCLENBQUE7QUFDbEMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFDTCxLQUFLLEVBR0wsZUFBZSxFQUNmLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLEtBQUssRUFDTCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixVQUFVLEVBQ1YscUJBQXFCLEVBQ3JCLFNBQVMsRUFDVixNQUFNLG1CQUFtQixDQUFBO0FBQzFCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFlakMsTUFBTSxxQkFBcUIsR0FBbUI7SUFDNUMsY0FBYyxFQUFFLEtBQUs7SUFDckIsZ0JBQWdCLEVBQUUsS0FBSztJQUN2Qiw2QkFBNkIsRUFBRSxJQUFJO0lBQ25DLFVBQVUsRUFBRSxJQUFJO0NBQ2pCLENBQUE7QUFXRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQUMsR0FBVyxFQUFFLE9BQXNDO0lBQy9GLGFBQWEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDekIsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDNUIsTUFBTSxLQUFLLEdBQUcsYUFBYSxFQUFFLENBQUE7SUFFN0IsTUFBTSxhQUFhLEdBQXdCLEVBQUUsR0FBRyxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUE7SUFFOUcsTUFBTSxTQUFTLEdBQW1DLEVBQUUsR0FBRyxFQUFFLGFBQWEsQ0FBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FB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
|
|
@@ -159,26 +159,26 @@ async function writeEmptySqlFileIfNotExists(scriptPath, scriptType) {
|
|
|
159
159
|
}
|
|
160
160
|
const contextNamePlaceholder = '{{context_name}}';
|
|
161
161
|
const migrationNamePlaceholder = '{{migration_name}}';
|
|
162
|
-
const cSharpMigrationFileTemplate = `using Microsoft.EntityFrameworkCore.Migrations;
|
|
163
|
-
using MikeyT.DbMigrations;
|
|
164
|
-
|
|
165
|
-
#nullable disable
|
|
166
|
-
|
|
167
|
-
namespace DbMigrator.Migrations.${contextNamePlaceholder}Migrations
|
|
168
|
-
{
|
|
169
|
-
public partial class ${migrationNamePlaceholder} : Migration
|
|
170
|
-
{
|
|
171
|
-
protected override void Up(MigrationBuilder migrationBuilder)
|
|
172
|
-
{
|
|
173
|
-
MigrationScriptRunner.RunScript(migrationBuilder, "${migrationNamePlaceholder}.sql");
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
protected override void Down(MigrationBuilder migrationBuilder)
|
|
177
|
-
{
|
|
178
|
-
MigrationScriptRunner.RunScript(migrationBuilder, "${migrationNamePlaceholder}_Down.sql");
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
162
|
+
const cSharpMigrationFileTemplate = `using Microsoft.EntityFrameworkCore.Migrations;
|
|
163
|
+
using MikeyT.DbMigrations;
|
|
164
|
+
|
|
165
|
+
#nullable disable
|
|
166
|
+
|
|
167
|
+
namespace DbMigrator.Migrations.${contextNamePlaceholder}Migrations
|
|
168
|
+
{
|
|
169
|
+
public partial class ${migrationNamePlaceholder} : Migration
|
|
170
|
+
{
|
|
171
|
+
protected override void Up(MigrationBuilder migrationBuilder)
|
|
172
|
+
{
|
|
173
|
+
MigrationScriptRunner.RunScript(migrationBuilder, "${migrationNamePlaceholder}.sql");
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
protected override void Down(MigrationBuilder migrationBuilder)
|
|
177
|
+
{
|
|
178
|
+
MigrationScriptRunner.RunScript(migrationBuilder, "${migrationNamePlaceholder}_Down.sql");
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
183
|
`;
|
|
184
184
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGJNaWdyYXRpb25VdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYk1pZ3JhdGlvblV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDNUcsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN4QixPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQTtBQUVsQzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLFdBQW1CLEVBQUUsYUFBcUIsRUFBRSxJQUFjLEVBQUUsT0FBTyxHQUFHLElBQUk7SUFDOUcsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQzVDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUE7SUFDN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDcEosT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFBO0FBQ3BCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxXQUFtQixFQUFFLGFBQXFCO0lBQy9FLE1BQU0sZUFBZSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUUsQ0FBQTtBQUM1RSxDQUFDO0FBRUQ7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
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { SimpleSpawnResult } from './generalUtils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Type guard for command passed to {@link spawnDockerCompose}.
|
|
4
|
+
*/
|
|
5
|
+
export type DockerComposeCommand = 'build' | 'config' | 'cp' | 'create' | 'down' | 'events' | 'exec' | 'images' | 'kill' | 'logs' | 'ls' | 'pause' | 'port' | 'ps' | 'pull' | 'push' | 'restart' | 'rm' | 'run' | 'start' | 'stop' | 'top' | 'unpause' | 'up' | 'version';
|
|
6
|
+
/**
|
|
7
|
+
* Check if the string is a valid docker compose project name:
|
|
8
|
+
*
|
|
9
|
+
* - Must contain only lowercase letters, digits, dashes and underscores
|
|
10
|
+
* - Must start with a lowercase letter or digit
|
|
11
|
+
*
|
|
12
|
+
* See https://docs.docker.com/compose/environment-variables/envvars/#compose_project_name.
|
|
13
|
+
* @param projectName The string to validate
|
|
14
|
+
* @returns `true` if the string is a valid docker compose project name, `false` otherwise
|
|
15
|
+
*/
|
|
16
|
+
export declare function isValidDockerComposeProjectName(projectName: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Check if the string is a valid docker container name:
|
|
19
|
+
*
|
|
20
|
+
* - Must start with a letter or digit
|
|
21
|
+
* - Contain only letters, digits, underscores and periods
|
|
22
|
+
* - Must not end with a period
|
|
23
|
+
* @param containerName The docker container name to validate.
|
|
24
|
+
* @returns `true` if valid, `false otherwise
|
|
25
|
+
*/
|
|
26
|
+
export declare function isValidDockerContainerName(containerName: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Options for {@link spawnDockerCompose}.
|
|
29
|
+
* @param projectName
|
|
30
|
+
* Note that there are other better options such as using the environment variable `COMPOSE_PROJECT_NAME`. See https://docs.docker.com/compose/environment-variables/envvars/#compose_project_name.
|
|
31
|
+
* @param attached Default: false. All commands that support the detached option wil use it unless attached is specified as true (-d support: exec, logs, ps, restart, run, start, stop, up)
|
|
32
|
+
* @param useDockerComposeFileDirectoryAsCwd Default: false. If true, the docker compose command will be run in the directory containing the docker compose file.
|
|
33
|
+
*/
|
|
34
|
+
export interface DockerComposeOptions {
|
|
35
|
+
/** Additional arguments to pass to the docker-compose command. */
|
|
36
|
+
args: string[];
|
|
37
|
+
/**
|
|
38
|
+
* Defaults to `false`. Controls whether or not the `--detach` option is passed. Note that this only applies to
|
|
39
|
+
* some commands (exec, logs, ps, restart, run, start, stop, up).
|
|
40
|
+
*/
|
|
41
|
+
attached: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* If not provided, it will default to using the directory that the docker-compose.yml is located in.
|
|
44
|
+
* Specifies what current working directory to use with the spawn command.
|
|
45
|
+
*
|
|
46
|
+
* **Important:**: this only affects the current working directory of the spawned process itself. The docker command will still only pull in env values from a `.env`
|
|
47
|
+
* file in the same directory as the docker-compose.yml, NOT the cwd passed here. If a different `.env` file path is needed, use the {@link altEnvFilePath} option. If
|
|
48
|
+
* you use the {@link altEnvFilePath} option with a relative path, ensure that it is relative to the current working directory passed with this option.
|
|
49
|
+
*/
|
|
50
|
+
cwd?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Optional. If provided, projectName will be passed as the `--project-name` param to `docker compose` so that generated containers will use it as a prefix
|
|
53
|
+
* instead of the default, which is the directory name where the docker-compose.yml is located.
|
|
54
|
+
*
|
|
55
|
+
* Alternate approaches for setting the docker compose project name:
|
|
56
|
+
*
|
|
57
|
+
* - Locate your docker-compose.yml file in the root of your project so that docker will use that directory name for prefixing generated containers
|
|
58
|
+
* - OR, locate your docker-compose.yml in a sub-directory named appropriately for use as a prefix for generated containers
|
|
59
|
+
* - OR, put a `.env` file in the same directory as your docker-compose.yml
|
|
60
|
+
* with the entry `COMPOSE_PROJECT_NAME=your-project-name`
|
|
61
|
+
*
|
|
62
|
+
* Additional note on docker compose project names form the official docker compose docs: "Project names must contain only lowercase letters, decimal digits,
|
|
63
|
+
* dashes, and underscores, and must begin with a lowercase letter or decimal digit". See https://docs.docker.com/compose/environment-variables/envvars/#compose_project_name.
|
|
64
|
+
*
|
|
65
|
+
*/
|
|
66
|
+
projectName?: string;
|
|
67
|
+
/**
|
|
68
|
+
* Optional. If provided, profile is passed to docker compose along with `--profile` param. Must match this regex: `[a-zA-Z0-9][a-zA-Z0-9_.-]+`.
|
|
69
|
+
*
|
|
70
|
+
* See https://docs.docker.com/compose/profiles/.
|
|
71
|
+
*/
|
|
72
|
+
profile?: string;
|
|
73
|
+
/**
|
|
74
|
+
* The option `useWslPrefix` set to `true` can be used If Docker Desktop is not installed on Windows and docker commands need to execute via wsl.
|
|
75
|
+
*/
|
|
76
|
+
useWslPrefix?: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Specify an alternative env file. This is useful since docker will normally only use a `.env` file in the same directory as the docker-compose.yml file,
|
|
79
|
+
* regardless of the current working directory of the running command. This path will be passed to docker compose using the `--env-file` option.
|
|
80
|
+
*
|
|
81
|
+
* **Important:** if using a relative path, be sure pass the appropriate value for {@link cwd} to this method so that the relative path can correctly be resolved.
|
|
82
|
+
*/
|
|
83
|
+
altEnvFilePath?: string;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* For docker compose commands, see https://docs.docker.com/compose/reference/. For available options for this wrapper function, see {@link DockerComposeOptions}.
|
|
87
|
+
*
|
|
88
|
+
* The current working directory will be the directory of the {@link dockerComposePath} unless specified in the options. This ensures relative paths in the
|
|
89
|
+
* docker compose file will be relative to itself by default.
|
|
90
|
+
*
|
|
91
|
+
* See {@link DockerComposeOptions.projectName} for info on where to locate your docker compose file and how to specify the docker project name.
|
|
92
|
+
* @param dockerComposePath Path to docker-compose.yml
|
|
93
|
+
* @param dockerComposeCommand The docker-compose command to run
|
|
94
|
+
* @param options {@link DockerComposeOptions} to use, including additional arguments to pass to the docker compose command and the project name
|
|
95
|
+
*/
|
|
96
|
+
export declare function spawnDockerCompose(dockerComposePath: string, dockerComposeCommand: DockerComposeCommand, options?: Partial<DockerComposeOptions>): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Similar to {@link simpleSpawnAsync} but meant for `docker` calls only. Determines whether to run `docker` or `wsl docker` based
|
|
99
|
+
* on platform being windows and config setting `useWslPrefixForDockerCommands`.
|
|
100
|
+
* @param args The args to be passed to the docker command.
|
|
101
|
+
*/
|
|
102
|
+
export declare function simpleSpawnDockerAsync(args: string[]): Promise<SimpleSpawnResult>;
|
|
103
|
+
/**
|
|
104
|
+
* Uses {@link which} to determine if docker is installed. If the `which` call doesn't find docker and the platform
|
|
105
|
+
* is Windows, then this will check the output of `wsl docker --version` to see if just the engine is installed.
|
|
106
|
+
* @returns `true` if docker is installed, `false` otherwise
|
|
107
|
+
*/
|
|
108
|
+
export declare function isDockerInstalled(): Promise<boolean>;
|
|
109
|
+
/**
|
|
110
|
+
* Runs the `docker info` command and looks for "error during connect" in the output to determine if docker is running. If you
|
|
111
|
+
* want to check if docker is installed, use {@link isDockerInstalled}.
|
|
112
|
+
* @returns `true` if docker is installed and running, `false` otherwise
|
|
113
|
+
*/
|
|
114
|
+
export declare function isDockerRunning(): Promise<boolean>;
|
|
115
|
+
/**
|
|
116
|
+
* Attempt to start the docker service if it isn't running. Whether it's running is determined by a call to {@link isDockerRunning}.
|
|
117
|
+
*
|
|
118
|
+
* Notes on docker startup command:
|
|
119
|
+
* - May require entering a password
|
|
120
|
+
* - On Windows with Docker Desktop and from within powershell or cmd it will run in powershell: `Start-Process "C:\Program Files\Docker\Docker\Docker Desktop.exe" -NoNewWindow`
|
|
121
|
+
* - On Windows without Docker Desktop from within powershell or cmd it will run: `sudo service docker start`
|
|
122
|
+
* - On Linux (including WSL) it will run: `sudo systemctl start docker`
|
|
123
|
+
* - Not currently supported on Mac
|
|
124
|
+
* - If you're on Windows and have Docker Desktop but it is stopped and you're in a WSL shell, docker will appear as if it's not installed and this method will throw
|
|
125
|
+
*
|
|
126
|
+
* @throws An {@link Error} If docker is not detected on the system.
|
|
127
|
+
* @throws An {@link Error} if docker is detected as installed and not running but the OS is Mac.
|
|
128
|
+
*/
|
|
129
|
+
export declare function ensureDockerRunning(): Promise<void>;
|
|
130
|
+
/**
|
|
131
|
+
* The name of a docker volume to delete. Respects the config value `useWslPrefixForDockerCommands`.
|
|
132
|
+
* @param volumeName The name of the docker volume to delete.
|
|
133
|
+
* @throws An {@link ExtendedError} if the volume does not exist or the volume is in use.
|
|
134
|
+
*/
|
|
135
|
+
export declare function deleteDockerComposeVolume(volumeName: string): Promise<void>;
|
|
136
|
+
/**
|
|
137
|
+
* This function will take the volume name as you defined it in `docker-compose.yml` and try getting the actual volume name that docker
|
|
138
|
+
* compose will use. This is needed because docker compose will prefix the volume name with the compose project name (directory name or env
|
|
139
|
+
* `COMPOSE_PROJECT_NAME` or `-p` passed to docker compose commands).
|
|
140
|
+
*
|
|
141
|
+
* This function respects the `useWslPrefixForDockerCommands` config option. See also: {@link deleteDockerComposeVolume}.
|
|
142
|
+
* @param volumeName The volume name as defined in the `docker-compose.yml` file.
|
|
143
|
+
* @returns The full name of the docker-compose-actualized docker volume.
|
|
144
|
+
*/
|
|
145
|
+
export declare function getDockerComposeVolumeName(volumeName: string): Promise<string | undefined>;
|
|
146
|
+
/**
|
|
147
|
+
* Check if a docker volume exists based on inclusion of the specified `volumeName` in any of the output lines of `docker volume ls`.
|
|
148
|
+
*
|
|
149
|
+
* This function respects the `useWslPrefixForDockerCommands` config option. See also: {@link deleteDockerComposeVolume}.
|
|
150
|
+
* @param volumeName The docker volume name to check.
|
|
151
|
+
* @returns `true` if the docker volume exists, otherwise `false`.
|
|
152
|
+
*/
|
|
153
|
+
export declare function dockerVolumeExists(volumeName: string): Promise<boolean>;
|
|
154
|
+
/**
|
|
155
|
+
* This will attempt to delete a docker volume using the `docker volume rm` command.
|
|
156
|
+
*
|
|
157
|
+
* **Warning: ** there will be no prompt or confirmation before attempting to delete the volume.
|
|
158
|
+
*
|
|
159
|
+
* This function respects the `useWslPrefixForDockerCommands` config option. See also: {@link deleteDockerComposeVolume}.
|
|
160
|
+
* @param volumeName The name of the docker volume to delete.
|
|
161
|
+
* @throws An {@link Error} if the volume doesn't exist or is in use.
|
|
162
|
+
*/
|
|
163
|
+
export declare function deleteDockerVolume(volumeName: string): Promise<void>;
|
|
164
|
+
//# sourceMappingURL=dockerUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dockerUtils.d.ts","sourceRoot":"","sources":["../../src/dockerUtils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiB,iBAAiB,EAA8L,MAAM,mBAAmB,CAAA;AAGhQ;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,QAAQ,GAAG,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,CAAA;AAIzQ;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAU5E;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,aAAa,EAAE,MAAM,WAE/D;AAED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,IAAI,EAAE,MAAM,EAAE,CAAA;IAEd;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAA;IAEjB;;;;;;;MAOE;IACF,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ;;;;;;;;;;;;;;OAcG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IAEtB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CAAC,iBAAiB,EAAE,MAAM,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFtK;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAIvF;AAED;;;;EAIE;AACF,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS1D;AAED;;;;GAIG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CASxD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CA8CzD;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBjF;AAED;;;;;;;;GAQG;AACH,wBAAsB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAIhG;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG7E;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { config } from './NodeCliUtilsConfig.js';
|
|
5
|
+
import { ExtendedError, getNormalizedError, getPowershellHackArgs, isPlatformLinux, isPlatformWindows, log, requireString, requireValidPath, simpleSpawnAsync, spawnAsync, toWslPath, trace, which, withRetryAsync } from './generalUtils.js';
|
|
6
|
+
import { spawnAsyncInternal, throwIfDockerNotReady } from './generalUtilsInternal.js';
|
|
7
|
+
const dockerComposeCommandsThatSupportDetached = ['exec', 'logs', 'ps', 'restart', 'run', 'start', 'stop', 'up'];
|
|
8
|
+
/**
|
|
9
|
+
* Check if the string is a valid docker compose project name:
|
|
10
|
+
*
|
|
11
|
+
* - Must contain only lowercase letters, digits, dashes and underscores
|
|
12
|
+
* - Must start with a lowercase letter or digit
|
|
13
|
+
*
|
|
14
|
+
* See https://docs.docker.com/compose/environment-variables/envvars/#compose_project_name.
|
|
15
|
+
* @param projectName The string to validate
|
|
16
|
+
* @returns `true` if the string is a valid docker compose project name, `false` otherwise
|
|
17
|
+
*/
|
|
18
|
+
export function isValidDockerComposeProjectName(projectName) {
|
|
19
|
+
requireString('projectName', projectName);
|
|
20
|
+
// Ensure first char is a lowercase letter or digit
|
|
21
|
+
if (!/^[a-z0-9]/.test(projectName[0])) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
// Ensure the rest of the chars are only lowercase letters, digits, dashes and underscores
|
|
25
|
+
return /^[a-z0-9-_]+$/.test(projectName);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if the string is a valid docker container name:
|
|
29
|
+
*
|
|
30
|
+
* - Must start with a letter or digit
|
|
31
|
+
* - Contain only letters, digits, underscores and periods
|
|
32
|
+
* - Must not end with a period
|
|
33
|
+
* @param containerName The docker container name to validate.
|
|
34
|
+
* @returns `true` if valid, `false otherwise
|
|
35
|
+
*/
|
|
36
|
+
export function isValidDockerContainerName(containerName) {
|
|
37
|
+
return /[a-zA-Z0-9][a-zA-Z0-9_.-]+/.test(containerName) && !containerName.endsWith('.');
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* For docker compose commands, see https://docs.docker.com/compose/reference/. For available options for this wrapper function, see {@link DockerComposeOptions}.
|
|
41
|
+
*
|
|
42
|
+
* The current working directory will be the directory of the {@link dockerComposePath} unless specified in the options. This ensures relative paths in the
|
|
43
|
+
* docker compose file will be relative to itself by default.
|
|
44
|
+
*
|
|
45
|
+
* See {@link DockerComposeOptions.projectName} for info on where to locate your docker compose file and how to specify the docker project name.
|
|
46
|
+
* @param dockerComposePath Path to docker-compose.yml
|
|
47
|
+
* @param dockerComposeCommand The docker-compose command to run
|
|
48
|
+
* @param options {@link DockerComposeOptions} to use, including additional arguments to pass to the docker compose command and the project name
|
|
49
|
+
*/
|
|
50
|
+
export async function spawnDockerCompose(dockerComposePath, dockerComposeCommand, options) {
|
|
51
|
+
requireValidPath('dockerComposePath', dockerComposePath);
|
|
52
|
+
requireString('dockerComposeCommand', dockerComposeCommand);
|
|
53
|
+
if (options?.cwd) {
|
|
54
|
+
requireValidPath('cwd', options.cwd);
|
|
55
|
+
}
|
|
56
|
+
if (options?.altEnvFilePath) {
|
|
57
|
+
requireValidPath('altEnvFilePath', options.altEnvFilePath);
|
|
58
|
+
}
|
|
59
|
+
if (options?.projectName && !isValidDockerComposeProjectName(options.projectName)) {
|
|
60
|
+
throw new Error('Invalid docker compose project name specified for the projectName param. Project names must contain only lowercase letters, decimal digits, dashes, and underscores, and must begin with a lowercase letter or decimal digit.');
|
|
61
|
+
}
|
|
62
|
+
if (options?.profile && !/[a-zA-Z0-9][a-zA-Z0-9_.-]+/.test(options.profile)) {
|
|
63
|
+
throw new Error('Invalid profile option - must match regex: [a-zA-Z0-9][a-zA-Z0-9_.-]+');
|
|
64
|
+
}
|
|
65
|
+
if (!await isDockerRunning()) {
|
|
66
|
+
throw new Error('Docker is not running');
|
|
67
|
+
}
|
|
68
|
+
const defaultOptions = { args: [], attached: false, projectName: undefined, cwd: undefined };
|
|
69
|
+
const mergedOptions = { ...defaultOptions, ...options };
|
|
70
|
+
if (!options || options.useWslPrefix === undefined) {
|
|
71
|
+
mergedOptions.useWslPrefix = config.useWslPrefixForDockerCommandsOnWindows;
|
|
72
|
+
}
|
|
73
|
+
const dockerComposeDir = path.dirname(dockerComposePath);
|
|
74
|
+
const dockerComposeFilename = path.basename(dockerComposePath);
|
|
75
|
+
if (!mergedOptions.cwd) {
|
|
76
|
+
mergedOptions.cwd = dockerComposeDir;
|
|
77
|
+
}
|
|
78
|
+
let dockerComposePathResolved = mergedOptions.cwd ? path.resolve(dockerComposePath) : dockerComposeFilename;
|
|
79
|
+
if (mergedOptions.useWslPrefix) {
|
|
80
|
+
dockerComposePathResolved = toWslPath(dockerComposePathResolved);
|
|
81
|
+
}
|
|
82
|
+
let spawnArgs = ['compose', '-f', dockerComposePathResolved];
|
|
83
|
+
if (mergedOptions.projectName) {
|
|
84
|
+
spawnArgs.push('--project-name', mergedOptions.projectName);
|
|
85
|
+
}
|
|
86
|
+
if (mergedOptions.profile) {
|
|
87
|
+
spawnArgs.push('--profile', mergedOptions.profile);
|
|
88
|
+
}
|
|
89
|
+
if (mergedOptions.altEnvFilePath) {
|
|
90
|
+
spawnArgs.push('--env-file', mergedOptions.useWslPrefix ? toWslPath(mergedOptions.altEnvFilePath) : mergedOptions.altEnvFilePath);
|
|
91
|
+
}
|
|
92
|
+
spawnArgs.push(dockerComposeCommand);
|
|
93
|
+
if (!mergedOptions.attached && dockerComposeCommandsThatSupportDetached.includes(dockerComposeCommand)) {
|
|
94
|
+
spawnArgs.push('--detach');
|
|
95
|
+
}
|
|
96
|
+
if (mergedOptions.args) {
|
|
97
|
+
spawnArgs = spawnArgs.concat(mergedOptions.args);
|
|
98
|
+
}
|
|
99
|
+
trace(`running command in ${mergedOptions.cwd}: docker ${spawnArgs.join(' ')}`);
|
|
100
|
+
const longRunning = dockerComposeCommandsThatSupportDetached.includes(dockerComposeCommand) && options?.attached === true;
|
|
101
|
+
trace(`docker compose command will be configured to use long running option: ${longRunning}`);
|
|
102
|
+
const spawnOptions = {
|
|
103
|
+
cwd: mergedOptions.cwd,
|
|
104
|
+
shell: isPlatformWindows(),
|
|
105
|
+
isLongRunning: longRunning
|
|
106
|
+
};
|
|
107
|
+
const spawnResult = mergedOptions.useWslPrefix ?
|
|
108
|
+
await spawnAsyncInternal('wsl', ['docker', ...spawnArgs], spawnOptions) :
|
|
109
|
+
await spawnAsyncInternal('docker', spawnArgs, spawnOptions);
|
|
110
|
+
if (spawnResult.code !== 0) {
|
|
111
|
+
throw new Error(`docker compose command failed with code ${spawnResult.code}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Similar to {@link simpleSpawnAsync} but meant for `docker` calls only. Determines whether to run `docker` or `wsl docker` based
|
|
116
|
+
* on platform being windows and config setting `useWslPrefixForDockerCommands`.
|
|
117
|
+
* @param args The args to be passed to the docker command.
|
|
118
|
+
*/
|
|
119
|
+
export async function simpleSpawnDockerAsync(args) {
|
|
120
|
+
const command = config.useWslPrefixForDockerCommandsOnWindows ? 'wsl' : 'docker';
|
|
121
|
+
const spawnArgs = command === 'docker' ? args : ['docker', ...args];
|
|
122
|
+
return await simpleSpawnAsync(command, spawnArgs);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Uses {@link which} to determine if docker is installed. If the `which` call doesn't find docker and the platform
|
|
126
|
+
* is Windows, then this will check the output of `wsl docker --version` to see if just the engine is installed.
|
|
127
|
+
* @returns `true` if docker is installed, `false` otherwise
|
|
128
|
+
*/
|
|
129
|
+
export async function isDockerInstalled() {
|
|
130
|
+
if ((await which('docker')).location) {
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
if (isPlatformWindows()) {
|
|
134
|
+
const result = await simpleSpawnAsync('wsl', ['docker', '--version']);
|
|
135
|
+
return result.code === 0;
|
|
136
|
+
}
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Runs the `docker info` command and looks for "error during connect" in the output to determine if docker is running. If you
|
|
141
|
+
* want to check if docker is installed, use {@link isDockerInstalled}.
|
|
142
|
+
* @returns `true` if docker is installed and running, `false` otherwise
|
|
143
|
+
*/
|
|
144
|
+
export async function isDockerRunning() {
|
|
145
|
+
try {
|
|
146
|
+
const result = isPlatformWindows() ?
|
|
147
|
+
await simpleSpawnAsync('wsl', ['docker', 'info']) :
|
|
148
|
+
await simpleSpawnAsync('docker', ['info']);
|
|
149
|
+
return result.code === 0 && !result.stdout.includes('error during connect');
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Attempt to start the docker service if it isn't running. Whether it's running is determined by a call to {@link isDockerRunning}.
|
|
157
|
+
*
|
|
158
|
+
* Notes on docker startup command:
|
|
159
|
+
* - May require entering a password
|
|
160
|
+
* - On Windows with Docker Desktop and from within powershell or cmd it will run in powershell: `Start-Process "C:\Program Files\Docker\Docker\Docker Desktop.exe" -NoNewWindow`
|
|
161
|
+
* - On Windows without Docker Desktop from within powershell or cmd it will run: `sudo service docker start`
|
|
162
|
+
* - On Linux (including WSL) it will run: `sudo systemctl start docker`
|
|
163
|
+
* - Not currently supported on Mac
|
|
164
|
+
* - If you're on Windows and have Docker Desktop but it is stopped and you're in a WSL shell, docker will appear as if it's not installed and this method will throw
|
|
165
|
+
*
|
|
166
|
+
* @throws An {@link Error} If docker is not detected on the system.
|
|
167
|
+
* @throws An {@link Error} if docker is detected as installed and not running but the OS is Mac.
|
|
168
|
+
*/
|
|
169
|
+
export async function ensureDockerRunning() {
|
|
170
|
+
if (!await isDockerInstalled()) {
|
|
171
|
+
throw new Error('Docker does not appear to be installed');
|
|
172
|
+
}
|
|
173
|
+
if (await isDockerRunning()) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
let command;
|
|
177
|
+
let args = [];
|
|
178
|
+
const isWindows = isPlatformWindows();
|
|
179
|
+
const isLinux = isPlatformLinux();
|
|
180
|
+
const dockerDesktopPath = 'C:\\Program Files\\Docker\\Docker\\Docker Desktop.exe';
|
|
181
|
+
let useExec = false;
|
|
182
|
+
if (isWindows) {
|
|
183
|
+
if (fs.existsSync(dockerDesktopPath)) {
|
|
184
|
+
command = 'powershell';
|
|
185
|
+
args = getPowershellHackArgs(`Start-Process 'C:\\Program Files\\Docker\\Docker\\Docker Desktop.exe' -NoNewWindow`);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
command = 'C:\\windows\\system32\\wsl.exe -u root -e sh -c "service docker start"';
|
|
189
|
+
useExec = true;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else if (isLinux) {
|
|
193
|
+
command = 'sudo';
|
|
194
|
+
args = ['service', 'docker', 'start'];
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
throw new Error('Starting docker within ensureDockerRunning is only supported on Windows and Linux - you will have to start docker manually');
|
|
198
|
+
}
|
|
199
|
+
if (useExec) {
|
|
200
|
+
try {
|
|
201
|
+
execSync(command, { stdio: 'inherit' });
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
throw new ExtendedError('Unable to start docker', getNormalizedError(err));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
const result = await spawnAsync(command, args, { shell: isWindows });
|
|
209
|
+
if (result.code !== 0) {
|
|
210
|
+
throw new Error('Unable to start docker - see error above');
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Wait for docker to be up and ready before continuing
|
|
214
|
+
await withRetryAsync(throwIfDockerNotReady, 6, 3000, { initialDelayMilliseconds: 3000 });
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* The name of a docker volume to delete. Respects the config value `useWslPrefixForDockerCommands`.
|
|
218
|
+
* @param volumeName The name of the docker volume to delete.
|
|
219
|
+
* @throws An {@link ExtendedError} if the volume does not exist or the volume is in use.
|
|
220
|
+
*/
|
|
221
|
+
export async function deleteDockerComposeVolume(volumeName) {
|
|
222
|
+
requireString('volumeName', volumeName);
|
|
223
|
+
// Docker compose volume names will have the same character restrictions as docker compose project names
|
|
224
|
+
if (!isValidDockerComposeProjectName(volumeName)) {
|
|
225
|
+
throw new Error(`Invalid volume name: ${volumeName}`);
|
|
226
|
+
}
|
|
227
|
+
try {
|
|
228
|
+
const composeVolumeName = await getDockerComposeVolumeName(volumeName);
|
|
229
|
+
if (!composeVolumeName) {
|
|
230
|
+
log(`volume ${volumeName} not found in docker compose config - skipping`);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (!await dockerVolumeExists(composeVolumeName)) {
|
|
234
|
+
log(`docker compose volume ${composeVolumeName} does not appear to exist - skipping`);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
await deleteDockerVolume(composeVolumeName);
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
throw new ExtendedError(`Error removing the volume ${volumeName}`, getNormalizedError(err));
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* This function will take the volume name as you defined it in `docker-compose.yml` and try getting the actual volume name that docker
|
|
245
|
+
* compose will use. This is needed because docker compose will prefix the volume name with the compose project name (directory name or env
|
|
246
|
+
* `COMPOSE_PROJECT_NAME` or `-p` passed to docker compose commands).
|
|
247
|
+
*
|
|
248
|
+
* This function respects the `useWslPrefixForDockerCommands` config option. See also: {@link deleteDockerComposeVolume}.
|
|
249
|
+
* @param volumeName The volume name as defined in the `docker-compose.yml` file.
|
|
250
|
+
* @returns The full name of the docker-compose-actualized docker volume.
|
|
251
|
+
*/
|
|
252
|
+
export async function getDockerComposeVolumeName(volumeName) {
|
|
253
|
+
const result = await simpleSpawnDockerAsync(['compose', 'config', '--format', 'json']);
|
|
254
|
+
const composeConfigJson = JSON.parse(result.stdout);
|
|
255
|
+
return composeConfigJson?.volumes?.[volumeName]?.name;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Check if a docker volume exists based on inclusion of the specified `volumeName` in any of the output lines of `docker volume ls`.
|
|
259
|
+
*
|
|
260
|
+
* This function respects the `useWslPrefixForDockerCommands` config option. See also: {@link deleteDockerComposeVolume}.
|
|
261
|
+
* @param volumeName The docker volume name to check.
|
|
262
|
+
* @returns `true` if the docker volume exists, otherwise `false`.
|
|
263
|
+
*/
|
|
264
|
+
export async function dockerVolumeExists(volumeName) {
|
|
265
|
+
const result = await simpleSpawnDockerAsync(['volume', 'ls']);
|
|
266
|
+
return result.stdoutLines.filter(ln => ln.includes(volumeName)).length > 0;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* This will attempt to delete a docker volume using the `docker volume rm` command.
|
|
270
|
+
*
|
|
271
|
+
* **Warning: ** there will be no prompt or confirmation before attempting to delete the volume.
|
|
272
|
+
*
|
|
273
|
+
* This function respects the `useWslPrefixForDockerCommands` config option. See also: {@link deleteDockerComposeVolume}.
|
|
274
|
+
* @param volumeName The name of the docker volume to delete.
|
|
275
|
+
* @throws An {@link Error} if the volume doesn't exist or is in use.
|
|
276
|
+
*/
|
|
277
|
+
export async function deleteDockerVolume(volumeName) {
|
|
278
|
+
trace(`deleting docker compose volume ${volumeName}`);
|
|
279
|
+
await simpleSpawnDockerAsync(['volume', 'rm', volumeName]);
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9ja2VyVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZG9ja2VyVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDeEIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsYUFBYSxFQUFxQixrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDaFEsT0FBTyxFQUF3QixrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBTzNHLE1BQU0sd0NBQXdDLEdBQTJCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO0FBRXhJOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSwrQkFBK0IsQ0FBQyxXQUFtQjtJQUNqRSxhQUFhLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBRXpDLG1EQUFtRDtJQUNuRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNyQyxPQUFPLEtBQUssQ0FBQTtLQUNiO0lBRUQsMEZBQTBGO0lBQzFGLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUMxQyxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsYUFBcUI7SUFDOUQsT0FBTyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ3pGLENBQUM7QUFtRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQUMsaUJBQXlCLEVBQUUsb0JBQTBDLEVBQUUsT0FBdUM7SUFDckosZ0JBQWdCLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtJQUN4RCxhQUFhLENBQUMsc0JBQXNCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtJQUMzRCxJQUFJLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDaEIsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtLQUNyQztJQUNELElBQUksT0FBTyxFQUFFLGNBQWMsRUFBRTtRQUMzQixnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUE7S0FDM0Q7SUFDRCxJQUFJLE9BQU8sRUFBRSxXQUFXLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDakYsTUFBTSxJQUFJLEtBQUssQ0FBQywrTkFBK04sQ0FBQyxDQUFBO0tBQ2pQO0lBQ0QsSUFBSSxPQUFPLEVBQUUsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUMzRSxNQUFNLElBQUksS0FBSyxDQUFDLHVFQUF1RSxDQUFDLENBQUE7S0FDekY7SUFDRCxJQUFJLENBQUMsTUFBTSxlQUFlLEVBQUUsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUE7S0FDekM7SUFFRCxNQUFNLGNBQWMsR0FBeUIsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUE7SUFDbEgsTUFBTSxhQUFhLEdBQUcsRUFBRSxHQUFHLGNBQWMsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFBO0lBQ3ZELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUU7UUFDbEQsYUFBYSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsc0NBQXNDLENBQUE7S0FDM0U7SUFFRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUN4RCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUU5RCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRTtRQUN0QixhQUFhLENBQUMsR0FBRyxHQUFHLGdCQUFnQixDQUFBO0tBQ3JDO0lBRUQsSUFBSSx5QkFBeUIsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFBO0lBQzNHLElBQUksYUFBYSxDQUFDLFlBQVksRUFBRTtRQUM5Qix5QkFBeUIsR0FBRyxTQUFTLENBQUMseUJBQXlCLENBQUMsQ0FBQTtLQUNqRTtJQUVELElBQUksU0FBUyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSx5QkFBeUIsQ0FBQyxDQUFBO0lBRTVELElBQUksYUFBYSxDQUFDLFdBQVcsRUFBRTtRQUM3QixTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtLQUM1RDtJQUVELElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRTtRQUN6QixTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUE7S0FDbkQ7SUFFRCxJQUFJLGFBQWEsQ0FBQyxjQUFjLEVBQUU7UUFDaEMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFBO0tBQ2xJO0lBRUQsU0FBUyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0lBRXBDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxJQUFJLHdDQUF3QyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1FBQ3RHLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7S0FDM0I7SUFFRCxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUU7UUFDdEIsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO0tBQ2pEO0lBRUQsS0FBSyxDQUFDLHNCQUFzQixhQUFhLENBQUMsR0FBRyxZQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRS9FLE1BQU0sV0FBVyxHQUFHLHdDQUF3QyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLE9BQU8sRUFBRSxRQUFRLEtBQUssSUFBSSxDQUFBO0lBRXpILEtBQUssQ0FBQyx5RUFBeUUsV0FBVyxFQUFFLENBQUMsQ0FBQTtJQUU3RixNQUFNLFlBQVksR0FBa0M7UUFDbEQsR0FBRyxFQUFFLGFBQWEsQ0FBQyxHQUFHO1FBQ3RCLEtBQUssRUFBRSxpQkFBaUIsRUFBRTtRQUMxQixhQUFhLEVBQUUsV0FBVztLQUMzQixDQUFBO0lBRUQsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlDLE1BQU0sa0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUN6RSxNQUFNLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUE7SUFFN0QsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtLQUMvRTtBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FBQyxJQUFjO0lBQ3pELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUE7SUFDaEYsTUFBTSxTQUFTLEdBQUcsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQ25FLE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUE7QUFDbkQsQ0FBQztBQUVEOzs7O0VBSUU7QUFDRixNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQjtJQUNyQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7UUFDcEMsT0FBTyxJQUFJLENBQUE7S0FDWjtJQUNELElBQUksaUJBQWlCLEVBQUUsRUFBRTtRQUN2QixNQUFNLE1BQU0sR0FBRyxNQUFNLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBQ3JFLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUE7S0FDekI7SUFDRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlO0lBQ25DLElBQUk7UUFDRixNQUFNLE1BQU0sR0FBRyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7WUFDbEMsTUFBTSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUM1QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtLQUM1RTtJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osT0FBTyxLQUFLLENBQUE7S0FDYjtBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUI7SUFDdkMsSUFBSSxDQUFDLE1BQU0saUJBQWlCLEVBQUUsRUFBRTtRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUE7S0FDMUQ7SUFFRCxJQUFJLE1BQU0sZUFBZSxFQUFFLEVBQUU7UUFDM0IsT0FBTTtLQUNQO0lBRUQsSUFBSSxPQUFlLENBQUE7SUFDbkIsSUFBSSxJQUFJLEdBQWEsRUFBRSxDQUFBO0lBQ3ZCLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixFQUFFLENBQUE7SUFDckMsTUFBTSxPQUFPLEdBQUcsZUFBZSxFQUFFLENBQUE7SUFDakMsTUFBTSxpQkFBaUIsR0FBRyx1REFBdUQsQ0FBQTtJQUNqRixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUE7SUFFbkIsSUFBSSxTQUFTLEVBQUU7UUFDYixJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsRUFBRTtZQUNwQyxPQUFPLEdBQUcsWUFBWSxDQUFBO1lBQ3RCLElBQUksR0FBRyxxQkFBcUIsQ0FBQyxvRkFBb0YsQ0FBQyxDQUFBO1NBQ25IO2FBQU07WUFDTCxPQUFPLEdBQUcsd0VBQXdFLENBQUE7WUFDbEYsT0FBTyxHQUFHLElBQUksQ0FBQTtTQUNmO0tBQ0Y7U0FBTSxJQUFJLE9BQU8sRUFBRTtRQUNsQixPQUFPLEdBQUcsTUFBTSxDQUFBO1FBQ2hCLElBQUksR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7S0FDdEM7U0FBTTtRQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsNEhBQTRILENBQUMsQ0FBQTtLQUM5STtJQUVELElBQUksT0FBTyxFQUFFO1FBQ1gsSUFBSTtZQUNGLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQTtTQUN4QztRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osTUFBTSxJQUFJLGFBQWEsQ0FBQyx3QkFBd0IsRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1NBQzNFO0tBQ0Y7U0FBTTtRQUNMLE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUNwRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQTtTQUM1RDtLQUNGO0lBRUQsdURBQXVEO0lBQ3ZELE1BQU0sY0FBYyxDQUFDLHFCQUFxQixFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSx3QkFBd0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQzFGLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx5QkFBeUIsQ0FBQyxVQUFrQjtJQUNoRSxhQUFhLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBRXZDLHdHQUF3RztJQUN4RyxJQUFJLENBQUMsK0JBQStCLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsVUFBVSxFQUFFLENBQUMsQ0FBQTtLQUN0RDtJQUVELElBQUk7UUFDRixNQUFNLGlCQUFpQixHQUFHLE1BQU0sMEJBQTBCLENBQUMsVUFBVSxDQUFDLENBQUE7UUFFdEUsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3RCLEdBQUcsQ0FBQyxVQUFVLFVBQVUsZ0RBQWdELENBQUMsQ0FBQTtZQUN6RSxPQUFNO1NBQ1A7UUFFRCxJQUFJLENBQUMsTUFBTSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQ2hELEdBQUcsQ0FBQyx5QkFBeUIsaUJBQWlCLHNDQUFzQyxDQUFDLENBQUE7WUFDckYsT0FBTTtTQUNQO1FBRUQsTUFBTSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0tBQzVDO0lBQUMsT0FBTyxHQUFHLEVBQUU7UUFDWixNQUFNLElBQUksYUFBYSxDQUFDLDZCQUE2QixVQUFVLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0tBQzVGO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSwwQkFBMEIsQ0FBQyxVQUFrQjtJQUNqRSxNQUFNLE1BQU0sR0FBRyxNQUFNLHNCQUFzQixDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUN0RixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ25ELE9BQU8saUJBQWlCLEVBQUUsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxDQUFBO0FBQ3ZELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUFDLFVBQWtCO0lBQ3pELE1BQU0sTUFBTSxHQUFHLE1BQU0sc0JBQXNCLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUM3RCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7QUFDNUUsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxVQUFrQjtJQUN6RCxLQUFLLENBQUMsa0NBQWtDLFVBQVUsRUFBRSxDQUFDLENBQUE7SUFDckQsTUFBTSxzQkFBc0IsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQTtBQUM1RCxDQUFDIn0=
|