@git.zone/tsdocker 1.15.0 → 1.16.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/classes.dockercontext.js +13 -3
- package/dist_ts/classes.dockerfile.d.ts +24 -10
- package/dist_ts/classes.dockerfile.js +163 -77
- package/dist_ts/classes.registrycopy.d.ts +70 -0
- package/dist_ts/classes.registrycopy.js +359 -0
- package/dist_ts/classes.tsdockermanager.d.ts +9 -1
- package/dist_ts/classes.tsdockermanager.js +51 -22
- package/dist_ts/classes.tsdockersession.d.ts +35 -0
- package/dist_ts/classes.tsdockersession.js +92 -0
- package/dist_ts/interfaces/index.d.ts +1 -0
- package/dist_ts/tsdocker.cli.js +4 -1
- package/package.json +1 -1
- package/readme.hints.md +12 -0
- package/readme.md +186 -111
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dockercontext.ts +12 -2
- package/ts/classes.dockerfile.ts +188 -86
- package/ts/classes.registrycopy.ts +511 -0
- package/ts/classes.tsdockermanager.ts +52 -22
- package/ts/classes.tsdockersession.ts +107 -0
- package/ts/interfaces/index.ts +1 -0
- package/ts/tsdocker.cli.ts +3 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/tsdocker',
|
|
6
|
-
version: '1.
|
|
6
|
+
version: '1.16.0',
|
|
7
7
|
description: 'develop npm modules cross platform with docker'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxvQkFBb0I7SUFDMUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLGdEQUFnRDtDQUM5RCxDQUFBIn0=
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as plugins from './tsdocker.plugins.js';
|
|
2
|
+
import * as fs from 'fs';
|
|
2
3
|
import { logger } from './tsdocker.logging.js';
|
|
3
4
|
const smartshellInstance = new plugins.smartshell.Smartshell({ executor: 'bash' });
|
|
4
5
|
export class DockerContext {
|
|
@@ -27,20 +28,29 @@ export class DockerContext {
|
|
|
27
28
|
if (infoResult.exitCode === 0 && infoResult.stdout) {
|
|
28
29
|
isRootless = infoResult.stdout.includes('name=rootless');
|
|
29
30
|
}
|
|
30
|
-
|
|
31
|
+
// Detect topology
|
|
32
|
+
let topology = 'local';
|
|
33
|
+
if (process.env.DOCKER_HOST && process.env.DOCKER_HOST.startsWith('tcp://')) {
|
|
34
|
+
topology = 'dind';
|
|
35
|
+
}
|
|
36
|
+
else if (fs.existsSync('/.dockerenv')) {
|
|
37
|
+
topology = 'socket-mount';
|
|
38
|
+
}
|
|
39
|
+
this.contextInfo = { name, endpoint, isRootless, dockerHost: process.env.DOCKER_HOST, topology };
|
|
31
40
|
return this.contextInfo;
|
|
32
41
|
}
|
|
33
42
|
/** Logs context info prominently. */
|
|
34
43
|
logContextInfo() {
|
|
35
44
|
if (!this.contextInfo)
|
|
36
45
|
return;
|
|
37
|
-
const { name, endpoint, isRootless, dockerHost } = this.contextInfo;
|
|
46
|
+
const { name, endpoint, isRootless, dockerHost, topology } = this.contextInfo;
|
|
38
47
|
logger.log('info', '=== DOCKER CONTEXT ===');
|
|
39
48
|
logger.log('info', `Context: ${name}`);
|
|
40
49
|
logger.log('info', `Endpoint: ${endpoint}`);
|
|
41
50
|
if (dockerHost)
|
|
42
51
|
logger.log('info', `DOCKER_HOST: ${dockerHost}`);
|
|
43
52
|
logger.log('info', `Rootless: ${isRootless ? 'yes' : 'no'}`);
|
|
53
|
+
logger.log('info', `Topology: ${topology || 'local'}`);
|
|
44
54
|
}
|
|
45
55
|
/** Emits rootless-specific warnings. */
|
|
46
56
|
logRootlessWarnings() {
|
|
@@ -56,4 +66,4 @@ export class DockerContext {
|
|
|
56
66
|
return `tsdocker-builder-${sanitized}`;
|
|
57
67
|
}
|
|
58
68
|
}
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kb2NrZXJjb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5kb2NrZXJjb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRy9DLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRW5GLE1BQU0sT0FBTyxhQUFhO0lBQ2pCLFdBQVcsR0FBOEIsSUFBSSxDQUFDO0lBRXJELGtFQUFrRTtJQUMzRCxVQUFVLENBQUMsV0FBbUI7UUFDbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEdBQUcsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLHFDQUFxQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxrR0FBa0c7SUFDM0YsS0FBSyxDQUFDLE1BQU07UUFDakIsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3JCLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQztRQUV6QixNQUFNLGFBQWEsR0FBRyxNQUFNLGtCQUFrQixDQUFDLFVBQVUsQ0FDdkQsOENBQThDLENBQy9DLENBQUM7UUFDRixJQUFJLGFBQWEsQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6RCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxP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
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DockerRegistry } from './classes.dockerregistry.js';
|
|
2
|
+
import { TsDockerSession } from './classes.tsdockersession.js';
|
|
2
3
|
import type { IDockerfileOptions } from './interfaces/index.js';
|
|
3
4
|
import type { TsDockerManager } from './classes.tsdockermanager.js';
|
|
4
5
|
/**
|
|
@@ -17,16 +18,16 @@ export declare class Dockerfile {
|
|
|
17
18
|
* Maps local Dockerfiles dependencies to the corresponding Dockerfile class instances
|
|
18
19
|
*/
|
|
19
20
|
static mapDockerfiles(sortedDockerfileArray: Dockerfile[]): Promise<Dockerfile[]>;
|
|
20
|
-
/**
|
|
21
|
-
static needsLocalRegistry(
|
|
21
|
+
/** Local registry is always needed — it's the canonical store for all built images. */
|
|
22
|
+
static needsLocalRegistry(_dockerfiles?: Dockerfile[], _options?: {
|
|
22
23
|
platform?: string;
|
|
23
24
|
}): boolean;
|
|
24
|
-
/** Starts a
|
|
25
|
-
static startLocalRegistry(isRootless?: boolean): Promise<void>;
|
|
26
|
-
/** Stops and removes the
|
|
27
|
-
static stopLocalRegistry(): Promise<void>;
|
|
25
|
+
/** Starts a persistent registry:2 container with session-unique port and name. */
|
|
26
|
+
static startLocalRegistry(session: TsDockerSession, isRootless?: boolean): Promise<void>;
|
|
27
|
+
/** Stops and removes the session-specific local registry container. */
|
|
28
|
+
static stopLocalRegistry(session: TsDockerSession): Promise<void>;
|
|
28
29
|
/** Pushes a built image to the local registry for buildx consumption. */
|
|
29
|
-
static pushToLocalRegistry(dockerfile: Dockerfile): Promise<void>;
|
|
30
|
+
static pushToLocalRegistry(session: TsDockerSession, dockerfile: Dockerfile): Promise<void>;
|
|
30
31
|
/**
|
|
31
32
|
* Groups topologically sorted Dockerfiles into dependency levels.
|
|
32
33
|
* Level 0 = no local dependencies; level N = depends on something in level N-1.
|
|
@@ -41,7 +42,7 @@ export declare class Dockerfile {
|
|
|
41
42
|
/**
|
|
42
43
|
* Builds the corresponding real docker image for each Dockerfile class instance
|
|
43
44
|
*/
|
|
44
|
-
static buildDockerfiles(sortedArrayArg: Dockerfile[], options?: {
|
|
45
|
+
static buildDockerfiles(sortedArrayArg: Dockerfile[], session: TsDockerSession, options?: {
|
|
45
46
|
platform?: string;
|
|
46
47
|
timeout?: number;
|
|
47
48
|
noCache?: boolean;
|
|
@@ -87,6 +88,7 @@ export declare class Dockerfile {
|
|
|
87
88
|
*/
|
|
88
89
|
static getDockerBuildArgs(managerRef: TsDockerManager): Promise<string>;
|
|
89
90
|
managerRef: TsDockerManager;
|
|
91
|
+
session?: TsDockerSession;
|
|
90
92
|
filePath: string;
|
|
91
93
|
repo: string;
|
|
92
94
|
version: string;
|
|
@@ -100,6 +102,11 @@ export declare class Dockerfile {
|
|
|
100
102
|
localBaseDockerfile: Dockerfile;
|
|
101
103
|
localRegistryTag?: string;
|
|
102
104
|
constructor(managerRefArg: TsDockerManager, options: IDockerfileOptions);
|
|
105
|
+
/**
|
|
106
|
+
* Creates a line-by-line handler for Docker build output that logs
|
|
107
|
+
* recognized layer/step lines in an emphasized format.
|
|
108
|
+
*/
|
|
109
|
+
private createBuildOutputHandler;
|
|
103
110
|
/**
|
|
104
111
|
* Builds the Dockerfile
|
|
105
112
|
*/
|
|
@@ -110,15 +117,22 @@ export declare class Dockerfile {
|
|
|
110
117
|
verbose?: boolean;
|
|
111
118
|
}): Promise<number>;
|
|
112
119
|
/**
|
|
113
|
-
* Pushes the Dockerfile to a registry
|
|
120
|
+
* Pushes the Dockerfile to a registry using OCI Distribution API copy
|
|
121
|
+
* from the local registry to the remote registry.
|
|
114
122
|
*/
|
|
115
123
|
push(dockerRegistryArg: DockerRegistry, versionSuffix?: string): Promise<void>;
|
|
124
|
+
/**
|
|
125
|
+
* Returns the destination repository for a given registry URL,
|
|
126
|
+
* using registryRepoMap if configured, otherwise the default repo.
|
|
127
|
+
*/
|
|
128
|
+
private getDestRepo;
|
|
116
129
|
/**
|
|
117
130
|
* Pulls the Dockerfile from a registry
|
|
118
131
|
*/
|
|
119
132
|
pull(registryArg: DockerRegistry, versionSuffixArg?: string): Promise<void>;
|
|
120
133
|
/**
|
|
121
|
-
* Tests the Dockerfile by running a test script if it exists
|
|
134
|
+
* Tests the Dockerfile by running a test script if it exists.
|
|
135
|
+
* For multi-platform builds, uses the local registry tag so Docker can auto-pull.
|
|
122
136
|
*/
|
|
123
137
|
test(): Promise<number>;
|
|
124
138
|
/**
|