@tryhuset/foundation-utils 4.84.2 → 4.84.3
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/src/cli.js +0 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -5
- package/dist/src/commands/dbEnd.d.ts +0 -8
- package/dist/src/commands/dbEnd.js +0 -51
- package/dist/src/commands/dbEnd.js.map +0 -1
- package/dist/src/commands/dbExport.d.ts +0 -12
- package/dist/src/commands/dbExport.js +0 -37
- package/dist/src/commands/dbExport.js.map +0 -1
- package/dist/src/commands/dbImport.d.ts +0 -14
- package/dist/src/commands/dbImport.js +0 -54
- package/dist/src/commands/dbImport.js.map +0 -1
- package/dist/src/commands/dbList.d.ts +0 -15
- package/dist/src/commands/dbList.js +0 -76
- package/dist/src/commands/dbList.js.map +0 -1
- package/dist/src/commands/dbRestore.d.ts +0 -14
- package/dist/src/commands/dbRestore.js +0 -69
- package/dist/src/commands/dbRestore.js.map +0 -1
- package/dist/src/commands/docker/docker.d.ts +0 -23
- package/dist/src/commands/docker/docker.js +0 -176
- package/dist/src/commands/docker/docker.js.map +0 -1
- package/dist/src/commands/docker/resolveComposeFile.d.ts +0 -5
- package/dist/src/commands/docker/resolveComposeFile.js +0 -22
- package/dist/src/commands/docker/resolveComposeFile.js.map +0 -1
- package/dist/src/commands/docker.d.ts +0 -23
- package/dist/src/commands/docker.js +0 -176
- package/dist/src/commands/docker.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolveComposeFile.js","sourceRoot":"","sources":["../../../../src/commands/docker/resolveComposeFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;AAE1B,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAE9C;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAa,EAAU,EAAE;IAC1D,MAAM,WAAW,GAAG,IAAI,IAAI,oBAAoB,CAAC;IACjD,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC;IAExB,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,WAAW,YAAY,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC5E,WAAW,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Creates a backup of Docker images and optionally updates them
|
|
3
|
-
*
|
|
4
|
-
* This command provides functionality to:
|
|
5
|
-
* - Create backups of current Docker images with tagged references
|
|
6
|
-
* - Update Docker images to their latest versions
|
|
7
|
-
* - Manage the backup process with various options
|
|
8
|
-
* - Create a modified compose file that references the backup tags
|
|
9
|
-
* - Restore from a provided backup compose file
|
|
10
|
-
* @param options The options for the docker command
|
|
11
|
-
* @param options.file The path to the Docker Compose file
|
|
12
|
-
* @param options.force Whether to force the operation
|
|
13
|
-
* @param options.backupOnly Whether to only create a backup
|
|
14
|
-
* @param options.noBackup Whether to not create a backup
|
|
15
|
-
* @param options.backupFile The path to a backup compose file to restore from
|
|
16
|
-
*/
|
|
17
|
-
export declare function docker(options: {
|
|
18
|
-
file: string;
|
|
19
|
-
force?: boolean;
|
|
20
|
-
backupOnly?: boolean;
|
|
21
|
-
noBackup?: boolean;
|
|
22
|
-
backupFile?: string;
|
|
23
|
-
}): Promise<void>;
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import { execSync } from 'child_process';
|
|
2
|
-
import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';
|
|
3
|
-
import { Chalk } from 'chalk';
|
|
4
|
-
import inquirer from 'inquirer';
|
|
5
|
-
import { exitProcess } from '../utils/processExit.js';
|
|
6
|
-
const chalk = new Chalk();
|
|
7
|
-
/**
|
|
8
|
-
* Creates a backup of Docker images and optionally updates them
|
|
9
|
-
*
|
|
10
|
-
* This command provides functionality to:
|
|
11
|
-
* - Create backups of current Docker images with tagged references
|
|
12
|
-
* - Update Docker images to their latest versions
|
|
13
|
-
* - Manage the backup process with various options
|
|
14
|
-
* - Create a modified compose file that references the backup tags
|
|
15
|
-
* - Restore from a provided backup compose file
|
|
16
|
-
* @param options The options for the docker command
|
|
17
|
-
* @param options.file The path to the Docker Compose file
|
|
18
|
-
* @param options.force Whether to force the operation
|
|
19
|
-
* @param options.backupOnly Whether to only create a backup
|
|
20
|
-
* @param options.noBackup Whether to not create a backup
|
|
21
|
-
* @param options.backupFile The path to a backup compose file to restore from
|
|
22
|
-
*/
|
|
23
|
-
export async function docker(options) {
|
|
24
|
-
const { file: COMPOSE_FILE, force, backupOnly, noBackup, backupFile } = options;
|
|
25
|
-
// If backupFile is provided, use it instead of the original compose file
|
|
26
|
-
const activeComposeFile = backupFile || COMPOSE_FILE;
|
|
27
|
-
// Validate compose file exists
|
|
28
|
-
if (!existsSync(activeComposeFile)) {
|
|
29
|
-
console.error(chalk.red(`Error: Compose file not found at ${activeComposeFile}`));
|
|
30
|
-
exitProcess(1);
|
|
31
|
-
}
|
|
32
|
-
// Configuration
|
|
33
|
-
const BACKUP_DIR = './docker_image_backups';
|
|
34
|
-
const DATE_FORMAT = new Date().toISOString().replace(/[:.]/g, '').slice(0, 15);
|
|
35
|
-
// Check for conflicting options
|
|
36
|
-
if (noBackup && backupOnly) {
|
|
37
|
-
console.error(chalk.red('Error: Cannot use both --no-backup and --backup-only options together'));
|
|
38
|
-
exitProcess(1);
|
|
39
|
-
}
|
|
40
|
-
if (backupFile && (backupOnly || noBackup)) {
|
|
41
|
-
console.error(chalk.red('Error: Cannot use --backup-file with --backup-only or --no-backup options'));
|
|
42
|
-
exitProcess(1);
|
|
43
|
-
}
|
|
44
|
-
// Create backup directory if it doesn't exist
|
|
45
|
-
if (!existsSync(BACKUP_DIR)) {
|
|
46
|
-
mkdirSync(BACKUP_DIR, { recursive: true });
|
|
47
|
-
}
|
|
48
|
-
// Confirm the user intention if not forced
|
|
49
|
-
if (!force) {
|
|
50
|
-
let message = '';
|
|
51
|
-
if (backupFile) {
|
|
52
|
-
message = `WARNING: This will restart all server processes using backup file: ${backupFile}`;
|
|
53
|
-
}
|
|
54
|
-
else if (backupOnly) {
|
|
55
|
-
message = 'This will create a backup of current Docker images (no system update)';
|
|
56
|
-
}
|
|
57
|
-
else if (noBackup) {
|
|
58
|
-
message = 'WARNING: This will restart all server processes WITHOUT creating a backup';
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
message = 'WARNING: This will restart all server processes';
|
|
62
|
-
}
|
|
63
|
-
const { confirm } = await inquirer.prompt([
|
|
64
|
-
{
|
|
65
|
-
type: 'confirm',
|
|
66
|
-
name: 'confirm',
|
|
67
|
-
message: chalk.yellow(message),
|
|
68
|
-
default: false
|
|
69
|
-
}
|
|
70
|
-
]);
|
|
71
|
-
if (!confirm) {
|
|
72
|
-
console.log(chalk.yellow('Operation aborted'));
|
|
73
|
-
exitProcess(1);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// Create a backup of the Docker images (only if not using a backup file)
|
|
77
|
-
if (!noBackup && !backupFile) {
|
|
78
|
-
console.log(chalk.blue('Creating backup of Docker images...'));
|
|
79
|
-
// Read the original compose file
|
|
80
|
-
const composeContent = readFileSync(COMPOSE_FILE, 'utf8');
|
|
81
|
-
let modifiedComposeContent = composeContent;
|
|
82
|
-
// Get list of services
|
|
83
|
-
const services = execSync(`docker compose -f "${COMPOSE_FILE}" ps --services`)
|
|
84
|
-
.toString()
|
|
85
|
-
.trim()
|
|
86
|
-
.split('\n');
|
|
87
|
-
// Create container info file with image IDs
|
|
88
|
-
const imageInfoFile = `${BACKUP_DIR}/image_info_${DATE_FORMAT}.txt`;
|
|
89
|
-
let imageInfo = `Docker Images Backup: ${DATE_FORMAT}\n`;
|
|
90
|
-
imageInfo += '----------------------------------------------\n';
|
|
91
|
-
// For each service, extract the image information and update compose file
|
|
92
|
-
for (const service of services) {
|
|
93
|
-
console.log(chalk.blue(`Documenting service: ${service}`));
|
|
94
|
-
try {
|
|
95
|
-
const containerId = execSync(`docker compose -f "${COMPOSE_FILE}" ps -q "${service}"`)
|
|
96
|
-
.toString()
|
|
97
|
-
.trim();
|
|
98
|
-
if (containerId) {
|
|
99
|
-
// Get image info
|
|
100
|
-
const imageId = execSync(`docker inspect --format='{{.Image}}' "${containerId}"`)
|
|
101
|
-
.toString()
|
|
102
|
-
.trim();
|
|
103
|
-
const imageName = execSync(`docker inspect --format='{{.Config.Image}}' "${containerId}"`)
|
|
104
|
-
.toString()
|
|
105
|
-
.trim();
|
|
106
|
-
imageInfo += `SERVICE: ${service}\n`;
|
|
107
|
-
imageInfo += `IMAGE ID: ${imageId}\n`;
|
|
108
|
-
imageInfo += `IMAGE NAME: ${imageName}\n`;
|
|
109
|
-
imageInfo += '---\n';
|
|
110
|
-
// Tag the current image with our backup tag
|
|
111
|
-
if (imageName) {
|
|
112
|
-
const backupTag = `${imageName.split(':')[0]}:backup_${DATE_FORMAT}`;
|
|
113
|
-
console.log(chalk.blue(`Tagging ${imageName} as ${backupTag}`));
|
|
114
|
-
execSync(`docker tag "${imageName}" "${backupTag}"`);
|
|
115
|
-
imageInfo += `BACKUP TAG: ${backupTag}\n\n`;
|
|
116
|
-
// Update the compose file to reference the backup tag
|
|
117
|
-
const originalImageRegex = new RegExp(`image:\\s*${imageName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}`, 'g');
|
|
118
|
-
modifiedComposeContent = modifiedComposeContent.replace(originalImageRegex, `image: ${backupTag}`);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
catch {
|
|
123
|
-
console.warn(chalk.yellow(`Warning: Could not process service ${service}`));
|
|
124
|
-
continue;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
// Write the modified compose file with backup tags
|
|
128
|
-
writeFileSync(`${BACKUP_DIR}/docker-compose_${DATE_FORMAT}.yaml`, modifiedComposeContent);
|
|
129
|
-
writeFileSync(imageInfoFile, imageInfo);
|
|
130
|
-
console.log(chalk.green(`Backup complete. Image information saved to: ${imageInfoFile}`));
|
|
131
|
-
console.log(chalk.green(`Modified compose file saved to: ${BACKUP_DIR}/docker-compose_${DATE_FORMAT}.yaml`));
|
|
132
|
-
}
|
|
133
|
-
// Perform update steps unless this is backup-only mode
|
|
134
|
-
if (!backupOnly) {
|
|
135
|
-
console.log(chalk.blue('Starting update process...'));
|
|
136
|
-
// Take down the current Docker Compose setup
|
|
137
|
-
execSync(`docker compose -f "${activeComposeFile}" down`);
|
|
138
|
-
// Pull the latest images specified in the Docker Compose file
|
|
139
|
-
execSync(`docker compose -f "${activeComposeFile}" pull`);
|
|
140
|
-
// Remove the dangling images to not get into a no space left situation
|
|
141
|
-
console.log(chalk.blue('Cleaning up dangling images...'));
|
|
142
|
-
try {
|
|
143
|
-
const cleanupOutput = execSync('docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi').toString();
|
|
144
|
-
console.log(cleanupOutput);
|
|
145
|
-
}
|
|
146
|
-
catch {
|
|
147
|
-
// Ignore errors if no dangling images
|
|
148
|
-
}
|
|
149
|
-
// Start up the Docker Compose setup in detached mode
|
|
150
|
-
execSync(`docker compose -f "${activeComposeFile}" up -d`);
|
|
151
|
-
console.log(chalk.green('Update completed successfully.'));
|
|
152
|
-
}
|
|
153
|
-
// Operation summary
|
|
154
|
-
if (backupFile) {
|
|
155
|
-
console.log(chalk.green(`Restore completed successfully using backup file: ${backupFile}`));
|
|
156
|
-
}
|
|
157
|
-
else if (backupOnly) {
|
|
158
|
-
console.log(chalk.green('Backup-only operation completed successfully.'));
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
if (noBackup) {
|
|
162
|
-
console.log(chalk.green('Update completed with no backup.'));
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
console.log(chalk.green('Update completed with backup.'));
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
if (!noBackup && !backupFile) {
|
|
169
|
-
console.log(chalk.blue('Backup information:'));
|
|
170
|
-
console.log(chalk.blue(`Backup location: ${BACKUP_DIR}`));
|
|
171
|
-
console.log(chalk.blue(`Backup timestamp: ${DATE_FORMAT}`));
|
|
172
|
-
console.log(chalk.blue(`Image info file: ${BACKUP_DIR}/image_info_${DATE_FORMAT}.txt`));
|
|
173
|
-
console.log(chalk.blue(`Modified Docker Compose file: ${BACKUP_DIR}/docker-compose_${DATE_FORMAT}.yaml`));
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
//# sourceMappingURL=docker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../src/commands/docker.ts"],"names":[],"mappings":"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"}
|