@git.zone/tsdocker 1.14.0 → 1.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dockerfile.d.ts +12 -5
- package/dist_ts/classes.dockerfile.js +45 -48
- package/dist_ts/classes.registrycopy.d.ts +70 -0
- package/dist_ts/classes.registrycopy.js +359 -0
- package/dist_ts/classes.tsdockermanager.d.ts +2 -1
- package/dist_ts/classes.tsdockermanager.js +28 -18
- 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/readme.hints.md +12 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dockerfile.ts +54 -56
- package/ts/classes.registrycopy.ts +511 -0
- package/ts/classes.tsdockermanager.ts +27 -18
- package/ts/tsdocker.cli.ts +190 -16
- package/ts/tsdocker.plugins.ts +2 -0
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.1",
|
|
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/readme.hints.md
CHANGED
|
@@ -108,6 +108,18 @@ tsdocker build --parallel --cached # works with both modes
|
|
|
108
108
|
|
|
109
109
|
Implementation: `Dockerfile.computeLevels()` groups topologically sorted Dockerfiles into dependency levels. `Dockerfile.runWithConcurrency()` provides a worker-pool pattern for bounded concurrency. Both are public static methods on the `Dockerfile` class. The parallel logic exists in both `Dockerfile.buildDockerfiles()` (standard mode) and `TsDockerManager.build()` (cached mode).
|
|
110
110
|
|
|
111
|
+
## OCI Distribution API Push (v1.16+)
|
|
112
|
+
|
|
113
|
+
All builds now go through a persistent local registry (`localhost:5234`) with volume storage at `.nogit/docker-registry/`. Pushes use the `RegistryCopy` class (`ts/classes.registrycopy.ts`) which implements the OCI Distribution API to copy images (including multi-arch manifest lists) from the local registry to remote registries. This replaces the old `docker tag + docker push` approach that only worked for single-platform images.
|
|
114
|
+
|
|
115
|
+
Key classes:
|
|
116
|
+
- `RegistryCopy` — HTTP-based OCI image copy (auth, blob transfer, manifest handling)
|
|
117
|
+
- `Dockerfile.push()` — Now delegates to `RegistryCopy.copyImage()`
|
|
118
|
+
- `Dockerfile.needsLocalRegistry()` — Always returns true
|
|
119
|
+
- `Dockerfile.startLocalRegistry()` — Uses persistent volume mount
|
|
120
|
+
|
|
121
|
+
The `config.push` field is now a no-op (kept for backward compat).
|
|
122
|
+
|
|
111
123
|
## Build Status
|
|
112
124
|
|
|
113
125
|
- Build: ✅ Passes
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/classes.dockerfile.ts
CHANGED
|
@@ -2,6 +2,7 @@ import * as plugins from './tsdocker.plugins.js';
|
|
|
2
2
|
import * as paths from './tsdocker.paths.js';
|
|
3
3
|
import { logger, formatDuration } from './tsdocker.logging.js';
|
|
4
4
|
import { DockerRegistry } from './classes.dockerregistry.js';
|
|
5
|
+
import { RegistryCopy } from './classes.registrycopy.js';
|
|
5
6
|
import type { IDockerfileOptions, ITsDockerConfig, IBuildCommandOptions } from './interfaces/index.js';
|
|
6
7
|
import type { TsDockerManager } from './classes.tsdockermanager.js';
|
|
7
8
|
import * as fs from 'fs';
|
|
@@ -139,31 +140,32 @@ export class Dockerfile {
|
|
|
139
140
|
return sortedDockerfileArray;
|
|
140
141
|
}
|
|
141
142
|
|
|
142
|
-
/**
|
|
143
|
+
/** Local registry is always needed — it's the canonical store for all built images. */
|
|
143
144
|
public static needsLocalRegistry(
|
|
144
|
-
|
|
145
|
-
|
|
145
|
+
_dockerfiles?: Dockerfile[],
|
|
146
|
+
_options?: { platform?: string },
|
|
146
147
|
): boolean {
|
|
147
|
-
|
|
148
|
-
if (!hasLocalDeps) return false;
|
|
149
|
-
const config = dockerfiles[0]?.managerRef?.config;
|
|
150
|
-
return !!options?.platform || !!(config?.platforms && config.platforms.length > 1);
|
|
148
|
+
return true;
|
|
151
149
|
}
|
|
152
150
|
|
|
153
|
-
/** Starts a
|
|
151
|
+
/** Starts a persistent registry:2 container on port 5234 with volume storage. */
|
|
154
152
|
public static async startLocalRegistry(isRootless?: boolean): Promise<void> {
|
|
153
|
+
// Ensure persistent storage directory exists
|
|
154
|
+
const registryDataDir = plugins.path.join(paths.cwd, '.nogit', 'docker-registry');
|
|
155
|
+
fs.mkdirSync(registryDataDir, { recursive: true });
|
|
156
|
+
|
|
155
157
|
await smartshellInstance.execSilent(
|
|
156
158
|
`docker rm -f ${LOCAL_REGISTRY_CONTAINER} 2>/dev/null || true`
|
|
157
159
|
);
|
|
158
160
|
const result = await smartshellInstance.execSilent(
|
|
159
|
-
`docker run -d --name ${LOCAL_REGISTRY_CONTAINER} -p ${LOCAL_REGISTRY_PORT}:5000 registry:2`
|
|
161
|
+
`docker run -d --name ${LOCAL_REGISTRY_CONTAINER} -p ${LOCAL_REGISTRY_PORT}:5000 -v "${registryDataDir}:/var/lib/registry" registry:2`
|
|
160
162
|
);
|
|
161
163
|
if (result.exitCode !== 0) {
|
|
162
164
|
throw new Error(`Failed to start local registry: ${result.stderr || result.stdout}`);
|
|
163
165
|
}
|
|
164
166
|
// registry:2 starts near-instantly; brief wait for readiness
|
|
165
167
|
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
166
|
-
logger.log('info', `Started local registry at ${LOCAL_REGISTRY_HOST} (
|
|
168
|
+
logger.log('info', `Started local registry at ${LOCAL_REGISTRY_HOST} (persistent storage at .nogit/docker-registry/)`);
|
|
167
169
|
if (isRootless) {
|
|
168
170
|
logger.log('warn', `[rootless] Registry on port ${LOCAL_REGISTRY_PORT} — if buildx cannot reach localhost:${LOCAL_REGISTRY_PORT}, try 127.0.0.1:${LOCAL_REGISTRY_PORT}`);
|
|
169
171
|
}
|
|
@@ -246,11 +248,8 @@ export class Dockerfile {
|
|
|
246
248
|
): Promise<Dockerfile[]> {
|
|
247
249
|
const total = sortedArrayArg.length;
|
|
248
250
|
const overallStart = Date.now();
|
|
249
|
-
const useRegistry = Dockerfile.needsLocalRegistry(sortedArrayArg, options);
|
|
250
251
|
|
|
251
|
-
|
|
252
|
-
await Dockerfile.startLocalRegistry(options?.isRootless);
|
|
253
|
-
}
|
|
252
|
+
await Dockerfile.startLocalRegistry(options?.isRootless);
|
|
254
253
|
|
|
255
254
|
try {
|
|
256
255
|
if (options?.parallel) {
|
|
@@ -282,8 +281,9 @@ export class Dockerfile {
|
|
|
282
281
|
|
|
283
282
|
await Dockerfile.runWithConcurrency(tasks, concurrency);
|
|
284
283
|
|
|
285
|
-
// After the entire level completes,
|
|
284
|
+
// After the entire level completes, push all to local registry + tag for deps
|
|
286
285
|
for (const df of level) {
|
|
286
|
+
// Tag in host daemon for dependency resolution
|
|
287
287
|
const dependentBaseImages = new Set<string>();
|
|
288
288
|
for (const other of sortedArrayArg) {
|
|
289
289
|
if (other.localBaseDockerfile === df && other.baseImage !== df.buildTag) {
|
|
@@ -294,7 +294,8 @@ export class Dockerfile {
|
|
|
294
294
|
logger.log('info', `Tagging ${df.buildTag} as ${fullTag} for local dependency resolution`);
|
|
295
295
|
await smartshellInstance.exec(`docker tag ${df.buildTag} ${fullTag}`);
|
|
296
296
|
}
|
|
297
|
-
|
|
297
|
+
// Push ALL images to local registry (skip if already pushed via buildx)
|
|
298
|
+
if (!df.localRegistryTag) {
|
|
298
299
|
await Dockerfile.pushToLocalRegistry(df);
|
|
299
300
|
}
|
|
300
301
|
}
|
|
@@ -321,16 +322,14 @@ export class Dockerfile {
|
|
|
321
322
|
await smartshellInstance.exec(`docker tag ${dockerfileArg.buildTag} ${fullTag}`);
|
|
322
323
|
}
|
|
323
324
|
|
|
324
|
-
// Push to local registry
|
|
325
|
-
if (
|
|
325
|
+
// Push ALL images to local registry (skip if already pushed via buildx)
|
|
326
|
+
if (!dockerfileArg.localRegistryTag) {
|
|
326
327
|
await Dockerfile.pushToLocalRegistry(dockerfileArg);
|
|
327
328
|
}
|
|
328
329
|
}
|
|
329
330
|
}
|
|
330
331
|
} finally {
|
|
331
|
-
|
|
332
|
-
await Dockerfile.stopLocalRegistry();
|
|
333
|
-
}
|
|
332
|
+
await Dockerfile.stopLocalRegistry();
|
|
334
333
|
}
|
|
335
334
|
|
|
336
335
|
logger.log('info', `Total build time: ${formatDuration(Date.now() - overallStart)}`);
|
|
@@ -594,17 +593,12 @@ export class Dockerfile {
|
|
|
594
593
|
buildCommand = `docker buildx build --platform ${platformOverride}${noCacheFlag}${buildContextFlag} --load -t ${this.buildTag} -f ${this.filePath} ${buildArgsString} .`;
|
|
595
594
|
logger.log('info', `Build: buildx --platform ${platformOverride} --load`);
|
|
596
595
|
} else if (config.platforms && config.platforms.length > 1) {
|
|
597
|
-
// Multi-platform build using buildx
|
|
596
|
+
// Multi-platform build using buildx — always push to local registry
|
|
598
597
|
const platformString = config.platforms.join(',');
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
logger.log('info', `Build: buildx --platform ${platformString} --push`);
|
|
604
|
-
} else {
|
|
605
|
-
buildCommand += ' --load';
|
|
606
|
-
logger.log('info', `Build: buildx --platform ${platformString} --load`);
|
|
607
|
-
}
|
|
598
|
+
const localTag = `${LOCAL_REGISTRY_HOST}/${this.buildTag}`;
|
|
599
|
+
buildCommand = `docker buildx build --platform ${platformString}${noCacheFlag}${buildContextFlag} -t ${localTag} -f ${this.filePath} ${buildArgsString} --push .`;
|
|
600
|
+
this.localRegistryTag = localTag;
|
|
601
|
+
logger.log('info', `Build: buildx --platform ${platformString} --push to local registry`);
|
|
608
602
|
} else {
|
|
609
603
|
// Standard build
|
|
610
604
|
const versionLabel = this.managerRef.projectInfo?.npm?.version || 'unknown';
|
|
@@ -645,38 +639,39 @@ export class Dockerfile {
|
|
|
645
639
|
}
|
|
646
640
|
|
|
647
641
|
/**
|
|
648
|
-
* Pushes the Dockerfile to a registry
|
|
642
|
+
* Pushes the Dockerfile to a registry using OCI Distribution API copy
|
|
643
|
+
* from the local registry to the remote registry.
|
|
649
644
|
*/
|
|
650
645
|
public async push(dockerRegistryArg: DockerRegistry, versionSuffix?: string): Promise<void> {
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
this.repo,
|
|
655
|
-
this.version,
|
|
656
|
-
versionSuffix
|
|
657
|
-
);
|
|
646
|
+
const destRepo = this.getDestRepo(dockerRegistryArg.registryUrl);
|
|
647
|
+
const destTag = versionSuffix ? `${this.version}_${versionSuffix}` : this.version;
|
|
648
|
+
const registryCopy = new RegistryCopy();
|
|
658
649
|
|
|
659
|
-
|
|
660
|
-
|
|
650
|
+
this.pushTag = `${dockerRegistryArg.registryUrl}/${destRepo}:${destTag}`;
|
|
651
|
+
logger.log('info', `Pushing ${this.pushTag} via OCI copy from local registry...`);
|
|
661
652
|
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
653
|
+
await registryCopy.copyImage(
|
|
654
|
+
LOCAL_REGISTRY_HOST,
|
|
655
|
+
this.repo,
|
|
656
|
+
this.version,
|
|
657
|
+
dockerRegistryArg.registryUrl,
|
|
658
|
+
destRepo,
|
|
659
|
+
destTag,
|
|
660
|
+
{ username: dockerRegistryArg.username, password: dockerRegistryArg.password },
|
|
670
661
|
);
|
|
671
662
|
|
|
672
|
-
if (inspectResult.exitCode === 0 && inspectResult.stdout.includes('@')) {
|
|
673
|
-
const imageDigest = inspectResult.stdout.split('@')[1]?.trim();
|
|
674
|
-
logger.log('info', `The image ${this.pushTag} has digest ${imageDigest}`);
|
|
675
|
-
}
|
|
676
|
-
|
|
677
663
|
logger.log('ok', `Pushed ${this.pushTag}`);
|
|
678
664
|
}
|
|
679
665
|
|
|
666
|
+
/**
|
|
667
|
+
* Returns the destination repository for a given registry URL,
|
|
668
|
+
* using registryRepoMap if configured, otherwise the default repo.
|
|
669
|
+
*/
|
|
670
|
+
private getDestRepo(registryUrl: string): string {
|
|
671
|
+
const config = this.managerRef.config;
|
|
672
|
+
return config.registryRepoMap?.[registryUrl] || this.repo;
|
|
673
|
+
}
|
|
674
|
+
|
|
680
675
|
/**
|
|
681
676
|
* Pulls the Dockerfile from a registry
|
|
682
677
|
*/
|
|
@@ -696,19 +691,22 @@ export class Dockerfile {
|
|
|
696
691
|
}
|
|
697
692
|
|
|
698
693
|
/**
|
|
699
|
-
* Tests the Dockerfile by running a test script if it exists
|
|
694
|
+
* Tests the Dockerfile by running a test script if it exists.
|
|
695
|
+
* For multi-platform builds, uses the local registry tag so Docker can auto-pull.
|
|
700
696
|
*/
|
|
701
697
|
public async test(): Promise<number> {
|
|
702
698
|
const startTime = Date.now();
|
|
703
699
|
const testDir = this.managerRef.config.testDir || plugins.path.join(paths.cwd, 'test');
|
|
704
700
|
const testFile = plugins.path.join(testDir, 'test_' + this.version + '.sh');
|
|
701
|
+
// Use local registry tag for multi-platform images (not in daemon), otherwise buildTag
|
|
702
|
+
const imageRef = this.localRegistryTag || this.buildTag;
|
|
705
703
|
|
|
706
704
|
const testFileExists = fs.existsSync(testFile);
|
|
707
705
|
|
|
708
706
|
if (testFileExists) {
|
|
709
707
|
// Run tests in container
|
|
710
708
|
await smartshellInstance.exec(
|
|
711
|
-
`docker run --name tsdocker_test_container --entrypoint="bash" ${
|
|
709
|
+
`docker run --name tsdocker_test_container --entrypoint="bash" ${imageRef} -c "mkdir /tsdocker_test"`
|
|
712
710
|
);
|
|
713
711
|
await smartshellInstance.exec(`docker cp ${testFile} tsdocker_test_container:/tsdocker_test/test.sh`);
|
|
714
712
|
await smartshellInstance.exec(`docker commit tsdocker_test_container tsdocker_test_image`);
|