@git.zone/tsdocker 1.14.0 → 1.15.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_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/tsdocker.cli.js +144 -18
- package/dist_ts/tsdocker.plugins.d.ts +2 -1
- package/dist_ts/tsdocker.plugins.js +3 -2
- package/package.json +2 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/tsdocker.cli.ts +190 -16
- package/ts/tsdocker.plugins.ts +2 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/tsdocker',
|
|
6
|
-
version: '1.
|
|
6
|
+
version: '1.15.0',
|
|
7
7
|
description: 'develop npm modules cross platform with docker'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxvQkFBb0I7SUFDMUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLGdEQUFnRDtDQUM5RCxDQUFBIn0=
|
package/dist_ts/tsdocker.cli.js
CHANGED
|
@@ -5,6 +5,7 @@ import * as ConfigModule from './tsdocker.config.js';
|
|
|
5
5
|
import * as DockerModule from './tsdocker.docker.js';
|
|
6
6
|
import { logger, ora } from './tsdocker.logging.js';
|
|
7
7
|
import { TsDockerManager } from './classes.tsdockermanager.js';
|
|
8
|
+
import { DockerContext } from './classes.dockercontext.js';
|
|
8
9
|
import { commitinfo } from './00_commitinfo_data.js';
|
|
9
10
|
const tsdockerCli = new plugins.smartcli.Smartcli();
|
|
10
11
|
tsdockerCli.addVersion(commitinfo.version);
|
|
@@ -218,23 +219,148 @@ export let run = () => {
|
|
|
218
219
|
});
|
|
219
220
|
});
|
|
220
221
|
tsdockerCli.addCommand('clean').subscribe(async (argvArg) => {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
222
|
+
try {
|
|
223
|
+
const autoYes = !!argvArg.y;
|
|
224
|
+
const includeAll = !!argvArg.all;
|
|
225
|
+
const smartshellInstance = new plugins.smartshell.Smartshell({ executor: 'bash' });
|
|
226
|
+
const interact = new plugins.smartinteract.SmartInteract();
|
|
227
|
+
// --- Docker context detection ---
|
|
228
|
+
ora.text('detecting docker context...');
|
|
229
|
+
const dockerContext = new DockerContext();
|
|
230
|
+
if (argvArg.context) {
|
|
231
|
+
dockerContext.setContext(argvArg.context);
|
|
232
|
+
}
|
|
233
|
+
await dockerContext.detect();
|
|
234
|
+
ora.stop();
|
|
235
|
+
dockerContext.logContextInfo();
|
|
236
|
+
const listResources = async (command) => {
|
|
237
|
+
const result = await smartshellInstance.execSilent(command);
|
|
238
|
+
if (result.exitCode !== 0 || !result.stdout.trim()) {
|
|
239
|
+
return [];
|
|
240
|
+
}
|
|
241
|
+
return result.stdout.trim().split('\n').filter(Boolean).map((line) => {
|
|
242
|
+
const parts = line.split('\t');
|
|
243
|
+
return {
|
|
244
|
+
id: parts[0],
|
|
245
|
+
display: parts.join(' | '),
|
|
246
|
+
};
|
|
247
|
+
});
|
|
248
|
+
};
|
|
249
|
+
// --- Helper: checkbox selection ---
|
|
250
|
+
const selectResources = async (name, message, resources) => {
|
|
251
|
+
if (autoYes) {
|
|
252
|
+
return resources.map((r) => r.id);
|
|
253
|
+
}
|
|
254
|
+
const answer = await interact.askQuestion({
|
|
255
|
+
name,
|
|
256
|
+
type: 'checkbox',
|
|
257
|
+
message,
|
|
258
|
+
default: [],
|
|
259
|
+
choices: resources.map((r) => ({ name: r.display, value: r.id })),
|
|
260
|
+
});
|
|
261
|
+
return answer.value;
|
|
262
|
+
};
|
|
263
|
+
// --- Helper: confirm action ---
|
|
264
|
+
const confirmAction = async (name, message) => {
|
|
265
|
+
if (autoYes) {
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
const answer = await interact.askQuestion({
|
|
269
|
+
name,
|
|
270
|
+
type: 'confirm',
|
|
271
|
+
message,
|
|
272
|
+
default: false,
|
|
273
|
+
});
|
|
274
|
+
return answer.value;
|
|
275
|
+
};
|
|
276
|
+
// === RUNNING CONTAINERS ===
|
|
277
|
+
const runningContainers = await listResources(`docker ps --format '{{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}'`);
|
|
278
|
+
if (runningContainers.length > 0) {
|
|
279
|
+
logger.log('info', `Found ${runningContainers.length} running container(s)`);
|
|
280
|
+
const selectedIds = await selectResources('runningContainers', 'Select running containers to kill:', runningContainers);
|
|
281
|
+
if (selectedIds.length > 0) {
|
|
282
|
+
logger.log('info', `Killing ${selectedIds.length} container(s)...`);
|
|
283
|
+
await smartshellInstance.exec(`docker kill ${selectedIds.join(' ')}`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
logger.log('info', 'No running containers found');
|
|
288
|
+
}
|
|
289
|
+
// === STOPPED CONTAINERS ===
|
|
290
|
+
const stoppedContainers = await listResources(`docker ps -a --filter status=exited --filter status=created --format '{{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}'`);
|
|
291
|
+
if (stoppedContainers.length > 0) {
|
|
292
|
+
logger.log('info', `Found ${stoppedContainers.length} stopped container(s)`);
|
|
293
|
+
const selectedIds = await selectResources('stoppedContainers', 'Select stopped containers to remove:', stoppedContainers);
|
|
294
|
+
if (selectedIds.length > 0) {
|
|
295
|
+
logger.log('info', `Removing ${selectedIds.length} container(s)...`);
|
|
296
|
+
await smartshellInstance.exec(`docker rm ${selectedIds.join(' ')}`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
logger.log('info', 'No stopped containers found');
|
|
301
|
+
}
|
|
302
|
+
// === DANGLING IMAGES ===
|
|
303
|
+
const danglingImages = await listResources(`docker images -f dangling=true --format '{{.ID}}\t{{.Repository}}:{{.Tag}}\t{{.Size}}'`);
|
|
304
|
+
if (danglingImages.length > 0) {
|
|
305
|
+
const confirmed = await confirmAction('removeDanglingImages', `Remove ${danglingImages.length} dangling image(s)?`);
|
|
306
|
+
if (confirmed) {
|
|
307
|
+
logger.log('info', `Removing ${danglingImages.length} dangling image(s)...`);
|
|
308
|
+
const ids = danglingImages.map((r) => r.id).join(' ');
|
|
309
|
+
await smartshellInstance.exec(`docker rmi ${ids}`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
logger.log('info', 'No dangling images found');
|
|
314
|
+
}
|
|
315
|
+
// === ALL IMAGES (only with --all) ===
|
|
316
|
+
if (includeAll) {
|
|
317
|
+
const allImages = await listResources(`docker images --format '{{.ID}}\t{{.Repository}}:{{.Tag}}\t{{.Size}}'`);
|
|
318
|
+
if (allImages.length > 0) {
|
|
319
|
+
logger.log('info', `Found ${allImages.length} image(s) total`);
|
|
320
|
+
const selectedIds = await selectResources('allImages', 'Select images to remove:', allImages);
|
|
321
|
+
if (selectedIds.length > 0) {
|
|
322
|
+
logger.log('info', `Removing ${selectedIds.length} image(s)...`);
|
|
323
|
+
await smartshellInstance.exec(`docker rmi -f ${selectedIds.join(' ')}`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
logger.log('info', 'No images found');
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// === DANGLING VOLUMES ===
|
|
331
|
+
const danglingVolumes = await listResources(`docker volume ls -f dangling=true --format '{{.Name}}\t{{.Driver}}'`);
|
|
332
|
+
if (danglingVolumes.length > 0) {
|
|
333
|
+
const confirmed = await confirmAction('removeDanglingVolumes', `Remove ${danglingVolumes.length} dangling volume(s)?`);
|
|
334
|
+
if (confirmed) {
|
|
335
|
+
logger.log('info', `Removing ${danglingVolumes.length} dangling volume(s)...`);
|
|
336
|
+
const names = danglingVolumes.map((r) => r.id).join(' ');
|
|
337
|
+
await smartshellInstance.exec(`docker volume rm ${names}`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
logger.log('info', 'No dangling volumes found');
|
|
342
|
+
}
|
|
343
|
+
// === ALL VOLUMES (only with --all) ===
|
|
344
|
+
if (includeAll) {
|
|
345
|
+
const allVolumes = await listResources(`docker volume ls --format '{{.Name}}\t{{.Driver}}'`);
|
|
346
|
+
if (allVolumes.length > 0) {
|
|
347
|
+
logger.log('info', `Found ${allVolumes.length} volume(s) total`);
|
|
348
|
+
const selectedIds = await selectResources('allVolumes', 'Select volumes to remove:', allVolumes);
|
|
349
|
+
if (selectedIds.length > 0) {
|
|
350
|
+
logger.log('info', `Removing ${selectedIds.length} volume(s)...`);
|
|
351
|
+
await smartshellInstance.exec(`docker volume rm ${selectedIds.join(' ')}`);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
logger.log('info', 'No volumes found');
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
logger.log('success', 'Docker cleanup completed!');
|
|
359
|
+
}
|
|
360
|
+
catch (err) {
|
|
361
|
+
logger.log('error', `Clean failed: ${err.message}`);
|
|
362
|
+
process.exit(1);
|
|
363
|
+
}
|
|
238
364
|
});
|
|
239
365
|
tsdockerCli.addCommand('vscode').subscribe(async (argvArg) => {
|
|
240
366
|
const smartshellInstance = new plugins.smartshell.Smartshell({
|
|
@@ -246,4 +372,4 @@ export let run = () => {
|
|
|
246
372
|
});
|
|
247
373
|
tsdockerCli.startParse();
|
|
248
374
|
};
|
|
249
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNkb2NrZXIuY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdHNkb2NrZXIuY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxLQUFLLEtBQUssTUFBTSxxQkFBcUIsQ0FBQztBQUU3QyxVQUFVO0FBQ1YsT0FBTyxLQUFLLFlBQVksTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssWUFBWSxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVyRCxNQUFNLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDcEQsV0FBVyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFM0MsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsRUFBRTtJQUNwQiw0REFBNEQ7SUFDNUQsV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUMsT0FBTyxFQUFDLEVBQUU7UUFDdEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRSxJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztRQUN0RCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLDRDQUE0QyxTQUFTLENB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
|
|
375
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNkb2NrZXIuY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdHNkb2NrZXIuY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxLQUFLLEtBQUssTUFBTSxxQkFBcUIsQ0FBQztBQUU3QyxVQUFVO0FBQ1YsT0FBTyxLQUFLLFlBQVksTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssWUFBWSxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFckQsTUFBTSxXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3BELFdBQVcsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRTNDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEVBQUU7SUFDcEIsNERBQTREO0lBQzVELFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFDLE9BQU8sRUFBQyxFQUFFO1FBQ3RELE1BQU0sU0FBUyxHQUFHLE1BQU0sWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEUsSUFBSSxTQUFTLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLDRCQUE0QixDQUFDLENBQUM7UUFDdEQsQ0FBQzthQUFNLENBQUM7WUFDTixN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
|
|
@@ -10,7 +10,8 @@ import * as smartlog from '@push.rocks/smartlog';
|
|
|
10
10
|
import * as smartlogDestinationLocal from '@push.rocks/smartlog-destination-local';
|
|
11
11
|
import * as smartlogSouceOra from '@push.rocks/smartlog-source-ora';
|
|
12
12
|
import * as smartopen from '@push.rocks/smartopen';
|
|
13
|
+
import * as smartinteract from '@push.rocks/smartinteract';
|
|
13
14
|
import * as smartshell from '@push.rocks/smartshell';
|
|
14
15
|
import * as smartstring from '@push.rocks/smartstring';
|
|
15
16
|
export declare const smartfs: SmartFs;
|
|
16
|
-
export { lik, npmextra, path, projectinfo, smartpromise, qenv, smartcli, smartlog, smartlogDestinationLocal, smartlogSouceOra, smartopen, smartshell, smartstring };
|
|
17
|
+
export { lik, npmextra, path, projectinfo, smartpromise, qenv, smartcli, smartinteract, smartlog, smartlogDestinationLocal, smartlogSouceOra, smartopen, smartshell, smartstring };
|
|
@@ -11,9 +11,10 @@ import * as smartlog from '@push.rocks/smartlog';
|
|
|
11
11
|
import * as smartlogDestinationLocal from '@push.rocks/smartlog-destination-local';
|
|
12
12
|
import * as smartlogSouceOra from '@push.rocks/smartlog-source-ora';
|
|
13
13
|
import * as smartopen from '@push.rocks/smartopen';
|
|
14
|
+
import * as smartinteract from '@push.rocks/smartinteract';
|
|
14
15
|
import * as smartshell from '@push.rocks/smartshell';
|
|
15
16
|
import * as smartstring from '@push.rocks/smartstring';
|
|
16
17
|
// Create smartfs instance
|
|
17
18
|
export const smartfs = new SmartFs(new SmartFsProviderNode());
|
|
18
|
-
export { lik, npmextra, path, projectinfo, smartpromise, qenv, smartcli, smartlog, smartlogDestinationLocal, smartlogSouceOra, smartopen, smartshell, smartstring };
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
export { lik, npmextra, path, projectinfo, smartpromise, qenv, smartcli, smartinteract, smartlog, smartlogDestinationLocal, smartlogSouceOra, smartopen, smartshell, smartstring };
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNkb2NrZXIucGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3RzZG9ja2VyLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CO0FBQ25CLE9BQU8sS0FBSyxHQUFHLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLElBQUksTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEtBQUssUUFBUSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sS0FBSyx3QkFBd0IsTUFBTSx3Q0FBd0MsQ0FBQztBQUNuRixPQUFPLEtBQUssZ0JBQWdCLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssYUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sS0FBSyxVQUFVLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxLQUFLLFdBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RCwwQkFBMEI7QUFDMUIsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0FBRTlELE9BQU8sRUFDTCxHQUFHLEVBQ0gsUUFBUSxFQUNSLElBQUksRUFDSixXQUFXLEVBQ1gsWUFBWSxFQUNaLElBQUksRUFDSixRQUFRLEVBQ1IsYUFBYSxFQUNiLFFBQVEsRUFDUix3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBQ2hCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNaLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@git.zone/tsdocker",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.15.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "develop npm modules cross platform with docker",
|
|
6
6
|
"main": "dist_ts/index.js",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"@push.rocks/smartanalytics": "^2.0.15",
|
|
48
48
|
"@push.rocks/smartcli": "^4.0.20",
|
|
49
49
|
"@push.rocks/smartfs": "^1.3.1",
|
|
50
|
+
"@push.rocks/smartinteract": "^2.0.16",
|
|
50
51
|
"@push.rocks/smartlog": "^3.1.10",
|
|
51
52
|
"@push.rocks/smartlog-destination-local": "^9.0.2",
|
|
52
53
|
"@push.rocks/smartlog-source-ora": "^1.0.9",
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/tsdocker.cli.ts
CHANGED
|
@@ -7,6 +7,7 @@ import * as DockerModule from './tsdocker.docker.js';
|
|
|
7
7
|
|
|
8
8
|
import { logger, ora } from './tsdocker.logging.js';
|
|
9
9
|
import { TsDockerManager } from './classes.tsdockermanager.js';
|
|
10
|
+
import { DockerContext } from './classes.dockercontext.js';
|
|
10
11
|
import type { IBuildCommandOptions } from './interfaces/index.js';
|
|
11
12
|
import { commitinfo } from './00_commitinfo_data.js';
|
|
12
13
|
|
|
@@ -236,27 +237,200 @@ export let run = () => {
|
|
|
236
237
|
});
|
|
237
238
|
|
|
238
239
|
tsdockerCli.addCommand('clean').subscribe(async argvArg => {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
const
|
|
242
|
-
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
|
|
240
|
+
try {
|
|
241
|
+
const autoYes = !!argvArg.y;
|
|
242
|
+
const includeAll = !!argvArg.all;
|
|
243
|
+
|
|
244
|
+
const smartshellInstance = new plugins.smartshell.Smartshell({ executor: 'bash' });
|
|
245
|
+
const interact = new plugins.smartinteract.SmartInteract();
|
|
246
|
+
|
|
247
|
+
// --- Docker context detection ---
|
|
248
|
+
ora.text('detecting docker context...');
|
|
249
|
+
const dockerContext = new DockerContext();
|
|
250
|
+
if (argvArg.context) {
|
|
251
|
+
dockerContext.setContext(argvArg.context as string);
|
|
252
|
+
}
|
|
253
|
+
await dockerContext.detect();
|
|
254
|
+
ora.stop();
|
|
255
|
+
dockerContext.logContextInfo();
|
|
246
256
|
|
|
247
|
-
|
|
248
|
-
|
|
257
|
+
// --- Helper: parse docker output into resource list ---
|
|
258
|
+
interface IDockerResource {
|
|
259
|
+
id: string;
|
|
260
|
+
display: string;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const listResources = async (command: string): Promise<IDockerResource[]> => {
|
|
264
|
+
const result = await smartshellInstance.execSilent(command);
|
|
265
|
+
if (result.exitCode !== 0 || !result.stdout.trim()) {
|
|
266
|
+
return [];
|
|
267
|
+
}
|
|
268
|
+
return result.stdout.trim().split('\n').filter(Boolean).map((line) => {
|
|
269
|
+
const parts = line.split('\t');
|
|
270
|
+
return {
|
|
271
|
+
id: parts[0],
|
|
272
|
+
display: parts.join(' | '),
|
|
273
|
+
};
|
|
274
|
+
});
|
|
275
|
+
};
|
|
249
276
|
|
|
250
|
-
|
|
251
|
-
|
|
277
|
+
// --- Helper: checkbox selection ---
|
|
278
|
+
const selectResources = async (
|
|
279
|
+
name: string,
|
|
280
|
+
message: string,
|
|
281
|
+
resources: IDockerResource[],
|
|
282
|
+
): Promise<string[]> => {
|
|
283
|
+
if (autoYes) {
|
|
284
|
+
return resources.map((r) => r.id);
|
|
285
|
+
}
|
|
286
|
+
const answer = await interact.askQuestion({
|
|
287
|
+
name,
|
|
288
|
+
type: 'checkbox',
|
|
289
|
+
message,
|
|
290
|
+
default: [],
|
|
291
|
+
choices: resources.map((r) => ({ name: r.display, value: r.id })),
|
|
292
|
+
});
|
|
293
|
+
return answer.value as string[];
|
|
294
|
+
};
|
|
252
295
|
|
|
253
|
-
|
|
254
|
-
|
|
296
|
+
// --- Helper: confirm action ---
|
|
297
|
+
const confirmAction = async (
|
|
298
|
+
name: string,
|
|
299
|
+
message: string,
|
|
300
|
+
): Promise<boolean> => {
|
|
301
|
+
if (autoYes) {
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
const answer = await interact.askQuestion({
|
|
305
|
+
name,
|
|
306
|
+
type: 'confirm',
|
|
307
|
+
message,
|
|
308
|
+
default: false,
|
|
309
|
+
});
|
|
310
|
+
return answer.value as boolean;
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
// === RUNNING CONTAINERS ===
|
|
314
|
+
const runningContainers = await listResources(
|
|
315
|
+
`docker ps --format '{{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}'`
|
|
316
|
+
);
|
|
317
|
+
if (runningContainers.length > 0) {
|
|
318
|
+
logger.log('info', `Found ${runningContainers.length} running container(s)`);
|
|
319
|
+
const selectedIds = await selectResources(
|
|
320
|
+
'runningContainers',
|
|
321
|
+
'Select running containers to kill:',
|
|
322
|
+
runningContainers,
|
|
323
|
+
);
|
|
324
|
+
if (selectedIds.length > 0) {
|
|
325
|
+
logger.log('info', `Killing ${selectedIds.length} container(s)...`);
|
|
326
|
+
await smartshellInstance.exec(`docker kill ${selectedIds.join(' ')}`);
|
|
327
|
+
}
|
|
328
|
+
} else {
|
|
329
|
+
logger.log('info', 'No running containers found');
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// === STOPPED CONTAINERS ===
|
|
333
|
+
const stoppedContainers = await listResources(
|
|
334
|
+
`docker ps -a --filter status=exited --filter status=created --format '{{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}'`
|
|
335
|
+
);
|
|
336
|
+
if (stoppedContainers.length > 0) {
|
|
337
|
+
logger.log('info', `Found ${stoppedContainers.length} stopped container(s)`);
|
|
338
|
+
const selectedIds = await selectResources(
|
|
339
|
+
'stoppedContainers',
|
|
340
|
+
'Select stopped containers to remove:',
|
|
341
|
+
stoppedContainers,
|
|
342
|
+
);
|
|
343
|
+
if (selectedIds.length > 0) {
|
|
344
|
+
logger.log('info', `Removing ${selectedIds.length} container(s)...`);
|
|
345
|
+
await smartshellInstance.exec(`docker rm ${selectedIds.join(' ')}`);
|
|
346
|
+
}
|
|
347
|
+
} else {
|
|
348
|
+
logger.log('info', 'No stopped containers found');
|
|
349
|
+
}
|
|
255
350
|
|
|
256
|
-
|
|
257
|
-
|
|
351
|
+
// === DANGLING IMAGES ===
|
|
352
|
+
const danglingImages = await listResources(
|
|
353
|
+
`docker images -f dangling=true --format '{{.ID}}\t{{.Repository}}:{{.Tag}}\t{{.Size}}'`
|
|
354
|
+
);
|
|
355
|
+
if (danglingImages.length > 0) {
|
|
356
|
+
const confirmed = await confirmAction(
|
|
357
|
+
'removeDanglingImages',
|
|
358
|
+
`Remove ${danglingImages.length} dangling image(s)?`,
|
|
359
|
+
);
|
|
360
|
+
if (confirmed) {
|
|
361
|
+
logger.log('info', `Removing ${danglingImages.length} dangling image(s)...`);
|
|
362
|
+
const ids = danglingImages.map((r) => r.id).join(' ');
|
|
363
|
+
await smartshellInstance.exec(`docker rmi ${ids}`);
|
|
364
|
+
}
|
|
365
|
+
} else {
|
|
366
|
+
logger.log('info', 'No dangling images found');
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// === ALL IMAGES (only with --all) ===
|
|
370
|
+
if (includeAll) {
|
|
371
|
+
const allImages = await listResources(
|
|
372
|
+
`docker images --format '{{.ID}}\t{{.Repository}}:{{.Tag}}\t{{.Size}}'`
|
|
373
|
+
);
|
|
374
|
+
if (allImages.length > 0) {
|
|
375
|
+
logger.log('info', `Found ${allImages.length} image(s) total`);
|
|
376
|
+
const selectedIds = await selectResources(
|
|
377
|
+
'allImages',
|
|
378
|
+
'Select images to remove:',
|
|
379
|
+
allImages,
|
|
380
|
+
);
|
|
381
|
+
if (selectedIds.length > 0) {
|
|
382
|
+
logger.log('info', `Removing ${selectedIds.length} image(s)...`);
|
|
383
|
+
await smartshellInstance.exec(`docker rmi -f ${selectedIds.join(' ')}`);
|
|
384
|
+
}
|
|
385
|
+
} else {
|
|
386
|
+
logger.log('info', 'No images found');
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// === DANGLING VOLUMES ===
|
|
391
|
+
const danglingVolumes = await listResources(
|
|
392
|
+
`docker volume ls -f dangling=true --format '{{.Name}}\t{{.Driver}}'`
|
|
393
|
+
);
|
|
394
|
+
if (danglingVolumes.length > 0) {
|
|
395
|
+
const confirmed = await confirmAction(
|
|
396
|
+
'removeDanglingVolumes',
|
|
397
|
+
`Remove ${danglingVolumes.length} dangling volume(s)?`,
|
|
398
|
+
);
|
|
399
|
+
if (confirmed) {
|
|
400
|
+
logger.log('info', `Removing ${danglingVolumes.length} dangling volume(s)...`);
|
|
401
|
+
const names = danglingVolumes.map((r) => r.id).join(' ');
|
|
402
|
+
await smartshellInstance.exec(`docker volume rm ${names}`);
|
|
403
|
+
}
|
|
404
|
+
} else {
|
|
405
|
+
logger.log('info', 'No dangling volumes found');
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// === ALL VOLUMES (only with --all) ===
|
|
409
|
+
if (includeAll) {
|
|
410
|
+
const allVolumes = await listResources(
|
|
411
|
+
`docker volume ls --format '{{.Name}}\t{{.Driver}}'`
|
|
412
|
+
);
|
|
413
|
+
if (allVolumes.length > 0) {
|
|
414
|
+
logger.log('info', `Found ${allVolumes.length} volume(s) total`);
|
|
415
|
+
const selectedIds = await selectResources(
|
|
416
|
+
'allVolumes',
|
|
417
|
+
'Select volumes to remove:',
|
|
418
|
+
allVolumes,
|
|
419
|
+
);
|
|
420
|
+
if (selectedIds.length > 0) {
|
|
421
|
+
logger.log('info', `Removing ${selectedIds.length} volume(s)...`);
|
|
422
|
+
await smartshellInstance.exec(`docker volume rm ${selectedIds.join(' ')}`);
|
|
423
|
+
}
|
|
424
|
+
} else {
|
|
425
|
+
logger.log('info', 'No volumes found');
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
logger.log('success', 'Docker cleanup completed!');
|
|
430
|
+
} catch (err) {
|
|
431
|
+
logger.log('error', `Clean failed: ${(err as Error).message}`);
|
|
432
|
+
process.exit(1);
|
|
258
433
|
}
|
|
259
|
-
ora.finishSuccess('docker environment now is clean!');
|
|
260
434
|
});
|
|
261
435
|
|
|
262
436
|
tsdockerCli.addCommand('vscode').subscribe(async argvArg => {
|
package/ts/tsdocker.plugins.ts
CHANGED
|
@@ -11,6 +11,7 @@ import * as smartlog from '@push.rocks/smartlog';
|
|
|
11
11
|
import * as smartlogDestinationLocal from '@push.rocks/smartlog-destination-local';
|
|
12
12
|
import * as smartlogSouceOra from '@push.rocks/smartlog-source-ora';
|
|
13
13
|
import * as smartopen from '@push.rocks/smartopen';
|
|
14
|
+
import * as smartinteract from '@push.rocks/smartinteract';
|
|
14
15
|
import * as smartshell from '@push.rocks/smartshell';
|
|
15
16
|
import * as smartstring from '@push.rocks/smartstring';
|
|
16
17
|
|
|
@@ -25,6 +26,7 @@ export {
|
|
|
25
26
|
smartpromise,
|
|
26
27
|
qenv,
|
|
27
28
|
smartcli,
|
|
29
|
+
smartinteract,
|
|
28
30
|
smartlog,
|
|
29
31
|
smartlogDestinationLocal,
|
|
30
32
|
smartlogSouceOra,
|