@nodetool-ai/deploy 0.7.0-rc.11
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/admin-client.d.ts +58 -0
- package/dist/admin-client.d.ts.map +1 -0
- package/dist/admin-client.js +275 -0
- package/dist/admin-client.js.map +1 -0
- package/dist/admin-operations.d.ts +197 -0
- package/dist/admin-operations.d.ts.map +1 -0
- package/dist/admin-operations.js +433 -0
- package/dist/admin-operations.js.map +1 -0
- package/dist/admin-routes.d.ts +306 -0
- package/dist/admin-routes.d.ts.map +1 -0
- package/dist/admin-routes.js +383 -0
- package/dist/admin-routes.js.map +1 -0
- package/dist/api-user-manager.d.ts +72 -0
- package/dist/api-user-manager.d.ts.map +1 -0
- package/dist/api-user-manager.js +89 -0
- package/dist/api-user-manager.js.map +1 -0
- package/dist/auth.d.ts +67 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +142 -0
- package/dist/auth.js.map +1 -0
- package/dist/collection-routes.d.ts +37 -0
- package/dist/collection-routes.d.ts.map +1 -0
- package/dist/collection-routes.js +43 -0
- package/dist/collection-routes.js.map +1 -0
- package/dist/compose.d.ts +52 -0
- package/dist/compose.d.ts.map +1 -0
- package/dist/compose.js +153 -0
- package/dist/compose.js.map +1 -0
- package/dist/configure.d.ts +87 -0
- package/dist/configure.d.ts.map +1 -0
- package/dist/configure.js +104 -0
- package/dist/configure.js.map +1 -0
- package/dist/deploy-to-gcp.d.ts +67 -0
- package/dist/deploy-to-gcp.d.ts.map +1 -0
- package/dist/deploy-to-gcp.js +268 -0
- package/dist/deploy-to-gcp.js.map +1 -0
- package/dist/deploy-to-runpod.d.ts +53 -0
- package/dist/deploy-to-runpod.d.ts.map +1 -0
- package/dist/deploy-to-runpod.js +207 -0
- package/dist/deploy-to-runpod.js.map +1 -0
- package/dist/deploy.d.ts +54 -0
- package/dist/deploy.d.ts.map +1 -0
- package/dist/deploy.js +82 -0
- package/dist/deploy.js.map +1 -0
- package/dist/deployment-config.d.ts +1073 -0
- package/dist/deployment-config.d.ts.map +1 -0
- package/dist/deployment-config.js +536 -0
- package/dist/deployment-config.js.map +1 -0
- package/dist/docker-run.d.ts +85 -0
- package/dist/docker-run.d.ts.map +1 -0
- package/dist/docker-run.js +202 -0
- package/dist/docker-run.js.map +1 -0
- package/dist/docker.d.ts +98 -0
- package/dist/docker.d.ts.map +1 -0
- package/dist/docker.js +396 -0
- package/dist/docker.js.map +1 -0
- package/dist/fly.d.ts +40 -0
- package/dist/fly.d.ts.map +1 -0
- package/dist/fly.js +291 -0
- package/dist/fly.js.map +1 -0
- package/dist/gcp.d.ts +59 -0
- package/dist/gcp.d.ts.map +1 -0
- package/dist/gcp.js +339 -0
- package/dist/gcp.js.map +1 -0
- package/dist/google-cloud-run-api.d.ts +134 -0
- package/dist/google-cloud-run-api.d.ts.map +1 -0
- package/dist/google-cloud-run-api.js +532 -0
- package/dist/google-cloud-run-api.js.map +1 -0
- package/dist/huggingface.d.ts +69 -0
- package/dist/huggingface.d.ts.map +1 -0
- package/dist/huggingface.js +346 -0
- package/dist/huggingface.js.map +1 -0
- package/dist/image-builder.d.ts +35 -0
- package/dist/image-builder.d.ts.map +1 -0
- package/dist/image-builder.js +157 -0
- package/dist/image-builder.js.map +1 -0
- package/dist/image-spec.d.ts +41 -0
- package/dist/image-spec.d.ts.map +1 -0
- package/dist/image-spec.js +49 -0
- package/dist/image-spec.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/manager.d.ts +121 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +225 -0
- package/dist/manager.js.map +1 -0
- package/dist/progress.d.ts +91 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +262 -0
- package/dist/progress.js.map +1 -0
- package/dist/railway.d.ts +65 -0
- package/dist/railway.d.ts.map +1 -0
- package/dist/railway.js +284 -0
- package/dist/railway.js.map +1 -0
- package/dist/remote-users.d.ts +74 -0
- package/dist/remote-users.d.ts.map +1 -0
- package/dist/remote-users.js +172 -0
- package/dist/remote-users.js.map +1 -0
- package/dist/runpod-api.d.ts +206 -0
- package/dist/runpod-api.d.ts.map +1 -0
- package/dist/runpod-api.js +703 -0
- package/dist/runpod-api.js.map +1 -0
- package/dist/runpod.d.ts +82 -0
- package/dist/runpod.d.ts.map +1 -0
- package/dist/runpod.js +188 -0
- package/dist/runpod.js.map +1 -0
- package/dist/self-hosted.d.ts +157 -0
- package/dist/self-hosted.d.ts.map +1 -0
- package/dist/self-hosted.js +799 -0
- package/dist/self-hosted.js.map +1 -0
- package/dist/ssh.d.ts +166 -0
- package/dist/ssh.d.ts.map +1 -0
- package/dist/ssh.js +430 -0
- package/dist/ssh.js.map +1 -0
- package/dist/state.d.ts +83 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +368 -0
- package/dist/state.js.map +1 -0
- package/dist/storage-routes.d.ts +55 -0
- package/dist/storage-routes.d.ts.map +1 -0
- package/dist/storage-routes.js +160 -0
- package/dist/storage-routes.js.map +1 -0
- package/dist/sync.d.ts +38 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +130 -0
- package/dist/sync.js.map +1 -0
- package/dist/workflow-syncer.d.ts +51 -0
- package/dist/workflow-syncer.d.ts.map +1 -0
- package/dist/workflow-syncer.js +192 -0
- package/dist/workflow-syncer.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-run.d.ts","sourceRoot":"","sources":["../src/docker-run.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,YAAY,OAAO,CAAC;AAOjC,oDAAoD;AACpD,UAAU,eAAe;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,kCAAkC;AAClC,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,sCAAsC;AACtC,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,kCAAkC;AAClC,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,8CAA8C;AAC9C,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAKxD;AAED,6EAA6E;AAC7E,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAiBD;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,SAAgB,UAAU,EAAE,mBAAmB,CAAC;IAChD,SAAgB,SAAS,EAAE,eAAe,CAAC;IAC3C,SAAgB,cAAc,EAAE,MAAM,CAAC;gBAGrC,UAAU,EAAE,mBAAmB,EAC/B,cAAc,GAAE,MAAiB;IAOnC,+CAA+C;IAC/C,eAAe,IAAI,MAAM;IAgDzB;;;OAGG;IACH,YAAY,IAAI,MAAM;IAgBtB,mCAAmC;IACnC,gBAAgB,IAAI,MAAM;IAQ1B,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,gBAAgB;IA4CxB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,YAAY;CAQrB;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,mBAAmB,GAC9B,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAGxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAGxE"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker run command generation for self-hosted deployments.
|
|
3
|
+
*
|
|
4
|
+
* This module generates docker run commands from deployment configuration,
|
|
5
|
+
* supporting GPU assignments, volume mounts, and environment variables.
|
|
6
|
+
*/
|
|
7
|
+
import * as crypto from "node:crypto";
|
|
8
|
+
import { shellEscape } from "./docker.js";
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Constants
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
export const INTERNAL_API_PORT = 7777;
|
|
13
|
+
export const APP_ENV_PORT = 8000;
|
|
14
|
+
/** Compute the full image name (name:tag). */
|
|
15
|
+
export function imageFullName(image) {
|
|
16
|
+
if (image.name.includes("@"))
|
|
17
|
+
return image.name;
|
|
18
|
+
const lastSegment = image.name.split("/").pop() ?? image.name;
|
|
19
|
+
if (lastSegment.includes(":"))
|
|
20
|
+
return image.name;
|
|
21
|
+
return `${image.name}:${image.tag}`;
|
|
22
|
+
}
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Safe shlex quote (allows ~/...)
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
function safeShellQuote(s) {
|
|
27
|
+
if (s.startsWith("~/")) {
|
|
28
|
+
return "~/" + shellEscape(s.slice(2));
|
|
29
|
+
}
|
|
30
|
+
return shellEscape(s);
|
|
31
|
+
}
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// DockerRunGenerator
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
/**
|
|
36
|
+
* Generates docker run command from deployment settings.
|
|
37
|
+
*
|
|
38
|
+
* Handles conversion of NodeTool deployment configuration into a docker run
|
|
39
|
+
* command suitable for single container deployment.
|
|
40
|
+
*/
|
|
41
|
+
export class DockerRunGenerator {
|
|
42
|
+
deployment;
|
|
43
|
+
container;
|
|
44
|
+
runtimeCommand;
|
|
45
|
+
constructor(deployment, runtimeCommand = "docker") {
|
|
46
|
+
this.deployment = deployment;
|
|
47
|
+
this.container = deployment.container;
|
|
48
|
+
this.runtimeCommand = runtimeCommand;
|
|
49
|
+
}
|
|
50
|
+
/** Generate docker run command as a string. */
|
|
51
|
+
generateCommand() {
|
|
52
|
+
const parts = [`${shellEscape(this.runtimeCommand)} run`];
|
|
53
|
+
// Detached mode
|
|
54
|
+
parts.push("-d");
|
|
55
|
+
// Container name
|
|
56
|
+
const containerName = `nodetool-${this.container.name}`;
|
|
57
|
+
parts.push(`--name ${shellEscape(containerName)}`);
|
|
58
|
+
// Restart policy
|
|
59
|
+
parts.push("--restart unless-stopped");
|
|
60
|
+
// Port mapping
|
|
61
|
+
const hostPort = this.resolveHostPort();
|
|
62
|
+
parts.push(`-p ${hostPort}:${INTERNAL_API_PORT}`);
|
|
63
|
+
// Volume mounts
|
|
64
|
+
for (const volume of this.buildVolumes()) {
|
|
65
|
+
parts.push(`-v ${volume}`);
|
|
66
|
+
}
|
|
67
|
+
// Environment variables
|
|
68
|
+
for (const env of this.buildEnvironment()) {
|
|
69
|
+
parts.push(`-e ${env}`);
|
|
70
|
+
}
|
|
71
|
+
// GPU configuration
|
|
72
|
+
if (this.container.gpu) {
|
|
73
|
+
const gpuArgs = this.buildGpuArgs();
|
|
74
|
+
parts.push(...gpuArgs);
|
|
75
|
+
}
|
|
76
|
+
// Health check
|
|
77
|
+
const healthcheck = `--health-cmd="curl -f http://localhost:${INTERNAL_API_PORT}/health || exit 1" ` +
|
|
78
|
+
"--health-interval=30s " +
|
|
79
|
+
"--health-timeout=10s " +
|
|
80
|
+
"--health-retries=3 " +
|
|
81
|
+
"--health-start-period=40s";
|
|
82
|
+
parts.push(healthcheck);
|
|
83
|
+
// Image name
|
|
84
|
+
parts.push(shellEscape(imageFullName(this.deployment.image)));
|
|
85
|
+
return parts.join(" \\\n ");
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Generate a hash of the docker run configuration.
|
|
89
|
+
* Can be used to detect changes in the configuration.
|
|
90
|
+
*/
|
|
91
|
+
generateHash() {
|
|
92
|
+
const configDict = {
|
|
93
|
+
image: imageFullName(this.deployment.image),
|
|
94
|
+
container_name: this.container.name,
|
|
95
|
+
port: this.resolveHostPort(),
|
|
96
|
+
volumes: this.buildVolumes(),
|
|
97
|
+
environment: this.buildEnvironment().sort(),
|
|
98
|
+
gpu: this.container.gpu ?? null
|
|
99
|
+
};
|
|
100
|
+
const configStr = JSON.stringify(configDict, Object.keys(configDict).sort());
|
|
101
|
+
return crypto.createHash("sha256").update(configStr).digest("hex");
|
|
102
|
+
}
|
|
103
|
+
/** Get the full container name. */
|
|
104
|
+
getContainerName() {
|
|
105
|
+
return `nodetool-${this.container.name}`;
|
|
106
|
+
}
|
|
107
|
+
// -----------------------------------------------------------------------
|
|
108
|
+
// Private helpers
|
|
109
|
+
// -----------------------------------------------------------------------
|
|
110
|
+
buildVolumes() {
|
|
111
|
+
const volumes = [];
|
|
112
|
+
// Workspace volume (read-write)
|
|
113
|
+
const workspacePath = this.deployment.paths.workspace;
|
|
114
|
+
volumes.push(`${workspacePath}:/workspace`);
|
|
115
|
+
// HuggingFace cache volume
|
|
116
|
+
const persistentPaths = this.deployment.persistentPaths;
|
|
117
|
+
if (persistentPaths) {
|
|
118
|
+
volumes.push(`${this.deployment.paths.hfCache}:/hf-cache`);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
volumes.push(`${this.deployment.paths.hfCache}:/hf-cache:ro`);
|
|
122
|
+
}
|
|
123
|
+
return volumes.map(safeShellQuote);
|
|
124
|
+
}
|
|
125
|
+
buildEnvironment() {
|
|
126
|
+
// Start with container environment
|
|
127
|
+
const env = {
|
|
128
|
+
...(this.container.environment ?? {})
|
|
129
|
+
};
|
|
130
|
+
// Add container-specific settings
|
|
131
|
+
env["PORT"] = String(APP_ENV_PORT);
|
|
132
|
+
env["NODETOOL_API_URL"] = `http://localhost:${this.container.port}`;
|
|
133
|
+
env["NODETOOL_SERVER_MODE"] = "private";
|
|
134
|
+
// Configure paths from persistentPaths if available
|
|
135
|
+
const persistentPaths = this.deployment.persistentPaths;
|
|
136
|
+
if (persistentPaths) {
|
|
137
|
+
env["USERS_FILE"] = persistentPaths.usersFile;
|
|
138
|
+
env["DB_PATH"] = persistentPaths.dbPath;
|
|
139
|
+
env["CHROMA_PATH"] = persistentPaths.chromaPath;
|
|
140
|
+
env["HF_HOME"] = persistentPaths.hfCache;
|
|
141
|
+
env["ASSET_BUCKET"] = persistentPaths.assetBucket;
|
|
142
|
+
env["AUTH_PROVIDER"] = "multi_user";
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
env["DB_PATH"] = "/workspace/nodetool.db";
|
|
146
|
+
env["HF_HOME"] = "/hf-cache";
|
|
147
|
+
if (!env["AUTH_PROVIDER"]) {
|
|
148
|
+
env["AUTH_PROVIDER"] = "static";
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Add workflow IDs if specified
|
|
152
|
+
if (this.container.workflows && this.container.workflows.length > 0) {
|
|
153
|
+
env["NODETOOL_WORKFLOWS"] = this.container.workflows.join(",");
|
|
154
|
+
}
|
|
155
|
+
// Add authentication token for self-hosted deployments
|
|
156
|
+
if (this.deployment.serverAuthToken) {
|
|
157
|
+
env["SERVER_AUTH_TOKEN"] = this.deployment.serverAuthToken;
|
|
158
|
+
}
|
|
159
|
+
// Convert to KEY=value format and quote
|
|
160
|
+
return Object.entries(env).map(([key, value]) => safeShellQuote(`${key}=${value}`));
|
|
161
|
+
}
|
|
162
|
+
resolveHostPort() {
|
|
163
|
+
const hostPort = this.container.port || APP_ENV_PORT;
|
|
164
|
+
if (hostPort === INTERNAL_API_PORT) {
|
|
165
|
+
return APP_ENV_PORT;
|
|
166
|
+
}
|
|
167
|
+
return hostPort;
|
|
168
|
+
}
|
|
169
|
+
buildGpuArgs() {
|
|
170
|
+
if (!this.container.gpu)
|
|
171
|
+
return [];
|
|
172
|
+
const gpuIds = this.container.gpu.trim();
|
|
173
|
+
// Format: --gpus '"device=0,1"' for multiple GPUs
|
|
174
|
+
const quotedDevice = shellEscape(`"device=${gpuIds}"`);
|
|
175
|
+
return [`--gpus ${quotedDevice}`];
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
// Convenience functions
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
/**
|
|
182
|
+
* Generate docker run command from deployment configuration.
|
|
183
|
+
*/
|
|
184
|
+
export function generateDockerRunCommand(deployment) {
|
|
185
|
+
const generator = new DockerRunGenerator(deployment);
|
|
186
|
+
return generator.generateCommand();
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get hash of the docker run configuration for change detection.
|
|
190
|
+
*/
|
|
191
|
+
export function getDockerRunHash(deployment) {
|
|
192
|
+
const generator = new DockerRunGenerator(deployment);
|
|
193
|
+
return generator.generateHash();
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get the container name for the deployment.
|
|
197
|
+
*/
|
|
198
|
+
export function getContainerName(deployment) {
|
|
199
|
+
const generator = new DockerRunGenerator(deployment);
|
|
200
|
+
return generator.getContainerName();
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=docker-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-run.js","sourceRoot":"","sources":["../src/docker-run.ts"],"names":[],"mappings":"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"}
|
package/dist/docker.d.ts
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker utilities for NodeTool deployment.
|
|
3
|
+
*
|
|
4
|
+
* This module contains all Docker-related functionality for building, pushing,
|
|
5
|
+
* and managing Docker images for NodeTool deployments.
|
|
6
|
+
*/
|
|
7
|
+
import { execFile } from "node:child_process";
|
|
8
|
+
/**
|
|
9
|
+
* Promisified `child_process.execFile` — runs a command with an argument array
|
|
10
|
+
* and no shell, returning `{ stdout, stderr }`.
|
|
11
|
+
*/
|
|
12
|
+
export declare const execFileAsync: typeof execFile.__promisify__;
|
|
13
|
+
/**
|
|
14
|
+
* Escape a string for safe shell inclusion (single-quote wrapping).
|
|
15
|
+
*/
|
|
16
|
+
export declare function shellEscape(value: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Run a command safely without shell expansion.
|
|
19
|
+
*
|
|
20
|
+
* @param command Shell command string to run.
|
|
21
|
+
* @param captureOutput If true, capture and return output. If false, stream output.
|
|
22
|
+
* @returns Captured output if captureOutput=true, empty string otherwise.
|
|
23
|
+
*/
|
|
24
|
+
export declare function runCommand(command: string, captureOutput?: boolean): string;
|
|
25
|
+
/**
|
|
26
|
+
* Run a command safely using execFileSync with an argument array (no shell).
|
|
27
|
+
*
|
|
28
|
+
* @param program The executable to run (e.g. "docker").
|
|
29
|
+
* @param args Array of arguments passed directly to the program.
|
|
30
|
+
* @param options.captureOutput If true, capture and return stdout.
|
|
31
|
+
* @returns Captured output if captureOutput=true, empty string otherwise.
|
|
32
|
+
*/
|
|
33
|
+
export declare function runCommandArgs(program: string, args: string[], options?: {
|
|
34
|
+
captureOutput?: boolean;
|
|
35
|
+
}): string;
|
|
36
|
+
/**
|
|
37
|
+
* Check if user is authenticated with the Docker registry.
|
|
38
|
+
*/
|
|
39
|
+
export declare function checkDockerAuth(_registry?: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Ensure user is authenticated with Docker registry.
|
|
42
|
+
* Note: interactive login prompt is not supported in this TS port;
|
|
43
|
+
* the function will throw if not authenticated.
|
|
44
|
+
*/
|
|
45
|
+
export declare function ensureDockerAuth(registry?: string): void;
|
|
46
|
+
/**
|
|
47
|
+
* Format the image name with proper registry and username prefix.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* formatImageName("my-workflow", "myuser") // "myuser/my-workflow"
|
|
51
|
+
* formatImageName("my-workflow", "myuser", "ghcr.io") // "ghcr.io/myuser/my-workflow"
|
|
52
|
+
*/
|
|
53
|
+
export declare function formatImageName(baseName: string, dockerUsername: string, registry?: string): string;
|
|
54
|
+
/**
|
|
55
|
+
* Generate a unique image tag based on current timestamp and random hash.
|
|
56
|
+
*
|
|
57
|
+
* @returns A unique tag in format 'YYYYMMDD-HHMMSS-abcdef'
|
|
58
|
+
*/
|
|
59
|
+
export declare function generateImageTag(): string;
|
|
60
|
+
export interface BuildDockerImageOptions {
|
|
61
|
+
imageName: string;
|
|
62
|
+
tag: string;
|
|
63
|
+
platform?: string;
|
|
64
|
+
useCache?: boolean;
|
|
65
|
+
autoPush?: boolean;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Build a Docker image for deployment.
|
|
69
|
+
*
|
|
70
|
+
* @returns true if the image was pushed to registry, false if only built locally.
|
|
71
|
+
*/
|
|
72
|
+
export declare function buildDockerImage(options: BuildDockerImageOptions): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Push Docker image to a registry with proper authentication checks.
|
|
75
|
+
*/
|
|
76
|
+
export declare function pushToRegistry(imageName: string, tag: string, registry?: string): void;
|
|
77
|
+
/**
|
|
78
|
+
* Get Docker username from Docker's configuration file.
|
|
79
|
+
*/
|
|
80
|
+
export declare function getDockerUsernameFromConfig(registry?: string): string | null;
|
|
81
|
+
export interface RunDockerImageOptions {
|
|
82
|
+
imageName: string;
|
|
83
|
+
tag: string;
|
|
84
|
+
hostPort: number;
|
|
85
|
+
containerPort?: number;
|
|
86
|
+
containerName?: string;
|
|
87
|
+
env?: Record<string, string>;
|
|
88
|
+
volumes?: Array<[string, string]>;
|
|
89
|
+
detach?: boolean;
|
|
90
|
+
gpus?: string | boolean;
|
|
91
|
+
remove?: boolean;
|
|
92
|
+
extraArgs?: string[];
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Run a Docker image and map it to a given host port.
|
|
96
|
+
*/
|
|
97
|
+
export declare function runDockerImage(options: RunDockerImageOptions): void;
|
|
98
|
+
//# sourceMappingURL=docker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAA0B,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAOtE;;;GAGG;AACH,eAAO,MAAM,aAAa,+BAAsB,CAAC;AAMjD;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD;AAMD;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,aAAa,GAAE,OAAe,GAC7B,MAAM,CAuBR;AAMD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GACpC,MAAM,CA0BR;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,GAAE,MAAoB,GAAG,OAAO,CAkBxE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,GAAE,MAAoB,GAAG,IAAI,CAMrE;AAMD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,QAAQ,GAAE,MAAoB,GAC7B,MAAM,CAKR;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAqBzC;AAMD,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAsH1E;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAoB,GAC7B,IAAI,CAkBN;AAMD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,GAAE,MAAoB,GAC7B,MAAM,GAAG,IAAI,CAkDf;AAMD,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAoDnE"}
|