@herdctl/core 2.0.1 → 2.1.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/config/__tests__/merge.test.js +11 -8
- package/dist/config/__tests__/merge.test.js.map +1 -1
- package/dist/config/__tests__/schema.test.js +143 -4
- package/dist/config/__tests__/schema.test.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +1250 -202
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +131 -13
- package/dist/config/schema.js.map +1 -1
- package/dist/runner/runtime/__tests__/docker-config.test.js +157 -1
- package/dist/runner/runtime/__tests__/docker-config.test.js.map +1 -1
- package/dist/runner/runtime/container-manager.d.ts.map +1 -1
- package/dist/runner/runtime/container-manager.js +46 -16
- package/dist/runner/runtime/container-manager.js.map +1 -1
- package/dist/runner/runtime/docker-config.d.ts +55 -4
- package/dist/runner/runtime/docker-config.d.ts.map +1 -1
- package/dist/runner/runtime/docker-config.js +49 -2
- package/dist/runner/runtime/docker-config.js.map +1 -1
- package/package.json +2 -2
|
@@ -59,6 +59,47 @@ export class ContainerManager {
|
|
|
59
59
|
*/
|
|
60
60
|
async createContainer(agentName, config, mounts, env) {
|
|
61
61
|
const containerName = `herdctl-${agentName}-${Date.now()}`;
|
|
62
|
+
// Build port bindings for HostConfig
|
|
63
|
+
const portBindings = {};
|
|
64
|
+
const exposedPorts = {};
|
|
65
|
+
for (const port of config.ports) {
|
|
66
|
+
const containerPortKey = `${port.containerPort}/tcp`;
|
|
67
|
+
portBindings[containerPortKey] = [{ HostPort: String(port.hostPort) }];
|
|
68
|
+
exposedPorts[containerPortKey] = {};
|
|
69
|
+
}
|
|
70
|
+
// Build tmpfs mounts for HostConfig
|
|
71
|
+
const tmpfsMounts = {};
|
|
72
|
+
for (const tmpfs of config.tmpfs) {
|
|
73
|
+
tmpfsMounts[tmpfs.path] = tmpfs.options ?? "";
|
|
74
|
+
}
|
|
75
|
+
// Build our translated HostConfig
|
|
76
|
+
const translatedHostConfig = {
|
|
77
|
+
// Resource limits
|
|
78
|
+
Memory: config.memoryBytes,
|
|
79
|
+
MemorySwap: config.memoryBytes, // Same as Memory = no swap
|
|
80
|
+
CpuShares: config.cpuShares, // undefined = no limit (full CPU access)
|
|
81
|
+
CpuPeriod: config.cpuPeriod, // CPU period in microseconds
|
|
82
|
+
CpuQuota: config.cpuQuota, // CPU quota in microseconds per period
|
|
83
|
+
PidsLimit: config.pidsLimit, // Max processes (prevents fork bombs)
|
|
84
|
+
// Network isolation
|
|
85
|
+
NetworkMode: config.network,
|
|
86
|
+
// Port bindings
|
|
87
|
+
PortBindings: Object.keys(portBindings).length > 0 ? portBindings : undefined,
|
|
88
|
+
// Volume mounts
|
|
89
|
+
Binds: mounts.map((m) => `${m.hostPath}:${m.containerPath}:${m.mode}`),
|
|
90
|
+
// Tmpfs mounts
|
|
91
|
+
Tmpfs: Object.keys(tmpfsMounts).length > 0 ? tmpfsMounts : undefined,
|
|
92
|
+
// Security hardening
|
|
93
|
+
SecurityOpt: ["no-new-privileges:true"],
|
|
94
|
+
CapDrop: ["ALL"],
|
|
95
|
+
ReadonlyRootfs: false, // Claude needs to write temp files
|
|
96
|
+
// Cleanup
|
|
97
|
+
AutoRemove: config.ephemeral,
|
|
98
|
+
};
|
|
99
|
+
// Merge with hostConfigOverride - override values take precedence
|
|
100
|
+
const finalHostConfig = config.hostConfigOverride
|
|
101
|
+
? { ...translatedHostConfig, ...config.hostConfigOverride }
|
|
102
|
+
: translatedHostConfig;
|
|
62
103
|
const createOptions = {
|
|
63
104
|
Image: config.image,
|
|
64
105
|
name: containerName,
|
|
@@ -69,22 +110,11 @@ export class ContainerManager {
|
|
|
69
110
|
Cmd: ["sleep", "infinity"],
|
|
70
111
|
WorkingDir: "/workspace",
|
|
71
112
|
Env: env,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
// Network isolation
|
|
78
|
-
NetworkMode: config.network,
|
|
79
|
-
// Volume mounts
|
|
80
|
-
Binds: mounts.map((m) => `${m.hostPath}:${m.containerPath}:${m.mode}`),
|
|
81
|
-
// Security hardening
|
|
82
|
-
SecurityOpt: ["no-new-privileges:true"],
|
|
83
|
-
CapDrop: ["ALL"],
|
|
84
|
-
ReadonlyRootfs: false, // Claude needs to write temp files
|
|
85
|
-
// Cleanup
|
|
86
|
-
AutoRemove: config.ephemeral,
|
|
87
|
-
},
|
|
113
|
+
// Exposed ports (required for port bindings)
|
|
114
|
+
ExposedPorts: Object.keys(exposedPorts).length > 0 ? exposedPorts : undefined,
|
|
115
|
+
// Container labels
|
|
116
|
+
Labels: Object.keys(config.labels).length > 0 ? config.labels : undefined,
|
|
117
|
+
HostConfig: finalHostConfig,
|
|
88
118
|
// Non-root user
|
|
89
119
|
User: config.user,
|
|
90
120
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container-manager.js","sourceRoot":"","sources":["../../../src/runner/runtime/container-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAKlC;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACnB,MAAM,CAAsB;IAC5B,iBAAiB,GAAG,IAAI,GAAG,EAAqB,CAAC;IAEzD,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;IAC1C,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,oBAAoB,CACxB,SAAiB,EACjB,MAAoB,EACpB,MAAqB,EACrB,GAAa;QAEb,sDAAsD;QACtD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACtC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;wBACvB,OAAO,QAAQ,CAAC;oBAClB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,8CAA8C;oBAC9C,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAE7E,sBAAsB;QACtB,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QAExB,8BAA8B;QAC9B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAC3B,SAAiB,EACjB,MAAoB,EACpB,MAAqB,EACrB,GAAa;QAEb,MAAM,aAAa,GAAG,WAAW,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAE3D,MAAM,
|
|
1
|
+
{"version":3,"file":"container-manager.js","sourceRoot":"","sources":["../../../src/runner/runtime/container-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* This module provides TypeScript types for Docker container configuration
|
|
5
5
|
* and utility functions for path mapping and container management.
|
|
6
6
|
*/
|
|
7
|
-
import type {
|
|
7
|
+
import type { HostConfig } from "dockerode";
|
|
8
|
+
import type { FleetDockerInput } from "../../config/schema.js";
|
|
8
9
|
/**
|
|
9
10
|
* Network isolation modes for Docker containers
|
|
10
11
|
*/
|
|
@@ -24,6 +25,24 @@ export interface PathMapping {
|
|
|
24
25
|
/** Mount mode: read-only or read-write */
|
|
25
26
|
mode: VolumeMode;
|
|
26
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Port binding configuration
|
|
30
|
+
*/
|
|
31
|
+
export interface PortBinding {
|
|
32
|
+
/** Port on the host */
|
|
33
|
+
hostPort: number;
|
|
34
|
+
/** Port in the container */
|
|
35
|
+
containerPort: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Tmpfs mount configuration
|
|
39
|
+
*/
|
|
40
|
+
export interface TmpfsMount {
|
|
41
|
+
/** Path inside the container */
|
|
42
|
+
path: string;
|
|
43
|
+
/** Mount options (e.g., "size=100m,mode=1777") */
|
|
44
|
+
options?: string;
|
|
45
|
+
}
|
|
27
46
|
/**
|
|
28
47
|
* Resolved Docker configuration with defaults applied
|
|
29
48
|
*/
|
|
@@ -40,6 +59,10 @@ export interface DockerConfig {
|
|
|
40
59
|
memoryBytes: number;
|
|
41
60
|
/** CPU shares (relative weight) */
|
|
42
61
|
cpuShares?: number;
|
|
62
|
+
/** CPU period in microseconds (for hard CPU limits) */
|
|
63
|
+
cpuPeriod?: number;
|
|
64
|
+
/** CPU quota in microseconds per period (for hard CPU limits) */
|
|
65
|
+
cpuQuota?: number;
|
|
43
66
|
/** Container user as "UID:GID" string */
|
|
44
67
|
user: string;
|
|
45
68
|
/** Maximum containers to keep per agent */
|
|
@@ -50,6 +73,16 @@ export interface DockerConfig {
|
|
|
50
73
|
workspaceMode: VolumeMode;
|
|
51
74
|
/** Environment variables to pass to the container */
|
|
52
75
|
env: Record<string, string>;
|
|
76
|
+
/** Port bindings */
|
|
77
|
+
ports: PortBinding[];
|
|
78
|
+
/** Tmpfs mounts */
|
|
79
|
+
tmpfs: TmpfsMount[];
|
|
80
|
+
/** Maximum number of processes (PIDs) */
|
|
81
|
+
pidsLimit?: number;
|
|
82
|
+
/** Container labels */
|
|
83
|
+
labels: Record<string, string>;
|
|
84
|
+
/** Raw dockerode HostConfig passthrough (fleet-level only) */
|
|
85
|
+
hostConfigOverride?: HostConfig;
|
|
53
86
|
}
|
|
54
87
|
/**
|
|
55
88
|
* Default Docker image for Claude Code containers
|
|
@@ -74,6 +107,22 @@ export declare const DEFAULT_MAX_CONTAINERS = 5;
|
|
|
74
107
|
* @throws Error if format is invalid
|
|
75
108
|
*/
|
|
76
109
|
export declare function parseMemoryToBytes(memory: string): number;
|
|
110
|
+
/**
|
|
111
|
+
* Parse port binding string to PortBinding
|
|
112
|
+
*
|
|
113
|
+
* @param port - Port string in format "hostPort:containerPort" or "containerPort"
|
|
114
|
+
* @returns PortBinding object
|
|
115
|
+
* @throws Error if format is invalid
|
|
116
|
+
*/
|
|
117
|
+
export declare function parsePortBinding(port: string): PortBinding;
|
|
118
|
+
/**
|
|
119
|
+
* Parse tmpfs mount string to TmpfsMount
|
|
120
|
+
*
|
|
121
|
+
* @param tmpfs - Tmpfs string in format "/path" or "/path:options"
|
|
122
|
+
* @returns TmpfsMount object
|
|
123
|
+
* @throws Error if format is invalid
|
|
124
|
+
*/
|
|
125
|
+
export declare function parseTmpfsMount(tmpfs: string): TmpfsMount;
|
|
77
126
|
/**
|
|
78
127
|
* Parse volume mount string to PathMapping
|
|
79
128
|
*
|
|
@@ -89,12 +138,14 @@ export declare function parseVolumeMount(volume: string): PathMapping;
|
|
|
89
138
|
*/
|
|
90
139
|
export declare function getHostUser(): string;
|
|
91
140
|
/**
|
|
92
|
-
* Resolve Docker config from agent configuration
|
|
141
|
+
* Resolve Docker config from fleet/agent configuration
|
|
93
142
|
*
|
|
94
143
|
* Applies defaults and parses string values to typed equivalents.
|
|
144
|
+
* After agent and fleet configs are merged, the result may include
|
|
145
|
+
* fleet-level options (image, network, volumes, etc.) and host_config.
|
|
95
146
|
*
|
|
96
|
-
* @param docker - Docker configuration
|
|
147
|
+
* @param docker - Docker configuration (merged agent + fleet config)
|
|
97
148
|
* @returns Fully resolved DockerConfig
|
|
98
149
|
*/
|
|
99
|
-
export declare function resolveDockerConfig(docker?:
|
|
150
|
+
export declare function resolveDockerConfig(docker?: FleetDockerInput): DockerConfig;
|
|
100
151
|
//# sourceMappingURL=docker-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker-config.d.ts","sourceRoot":"","sources":["../../../src/runner/runtime/docker-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"docker-config.d.ts","sourceRoot":"","sources":["../../../src/runner/runtime/docker-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;AAErC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,IAAI,EAAE,UAAU,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,iFAAiF;IACjF,SAAS,EAAE,OAAO,CAAC;IACnB,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,OAAO,EAAE,WAAW,CAAC;IACrB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,2BAA2B;IAC3B,aAAa,EAAE,UAAU,CAAC;IAC1B,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,oBAAoB;IACpB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,mBAAmB;IACnB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,UAAU,CAAC;CACjC;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,2BAA2B,CAAC;AAE7D;;GAEG;AACH,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC;;GAEG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAoBzD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAkB1D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAYzD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAoB5D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAKpC;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,YAAY,CAqB3E"}
|
|
@@ -42,6 +42,44 @@ export function parseMemoryToBytes(memory) {
|
|
|
42
42
|
};
|
|
43
43
|
return Math.floor(value * multipliers[unit]);
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Parse port binding string to PortBinding
|
|
47
|
+
*
|
|
48
|
+
* @param port - Port string in format "hostPort:containerPort" or "containerPort"
|
|
49
|
+
* @returns PortBinding object
|
|
50
|
+
* @throws Error if format is invalid
|
|
51
|
+
*/
|
|
52
|
+
export function parsePortBinding(port) {
|
|
53
|
+
const parts = port.split(":");
|
|
54
|
+
if (parts.length === 1) {
|
|
55
|
+
// Just container port - use same port on host
|
|
56
|
+
const containerPort = parseInt(parts[0], 10);
|
|
57
|
+
return { hostPort: containerPort, containerPort };
|
|
58
|
+
}
|
|
59
|
+
if (parts.length === 2) {
|
|
60
|
+
const hostPort = parseInt(parts[0], 10);
|
|
61
|
+
const containerPort = parseInt(parts[1], 10);
|
|
62
|
+
return { hostPort, containerPort };
|
|
63
|
+
}
|
|
64
|
+
throw new Error(`Invalid port format: "${port}". Use "hostPort:containerPort" or "containerPort".`);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Parse tmpfs mount string to TmpfsMount
|
|
68
|
+
*
|
|
69
|
+
* @param tmpfs - Tmpfs string in format "/path" or "/path:options"
|
|
70
|
+
* @returns TmpfsMount object
|
|
71
|
+
* @throws Error if format is invalid
|
|
72
|
+
*/
|
|
73
|
+
export function parseTmpfsMount(tmpfs) {
|
|
74
|
+
const colonIndex = tmpfs.indexOf(":");
|
|
75
|
+
if (colonIndex === -1) {
|
|
76
|
+
// Just path, no options
|
|
77
|
+
return { path: tmpfs };
|
|
78
|
+
}
|
|
79
|
+
const path = tmpfs.slice(0, colonIndex);
|
|
80
|
+
const options = tmpfs.slice(colonIndex + 1);
|
|
81
|
+
return { path, options };
|
|
82
|
+
}
|
|
45
83
|
/**
|
|
46
84
|
* Parse volume mount string to PathMapping
|
|
47
85
|
*
|
|
@@ -73,11 +111,13 @@ export function getHostUser() {
|
|
|
73
111
|
return `${uid}:${gid}`;
|
|
74
112
|
}
|
|
75
113
|
/**
|
|
76
|
-
* Resolve Docker config from agent configuration
|
|
114
|
+
* Resolve Docker config from fleet/agent configuration
|
|
77
115
|
*
|
|
78
116
|
* Applies defaults and parses string values to typed equivalents.
|
|
117
|
+
* After agent and fleet configs are merged, the result may include
|
|
118
|
+
* fleet-level options (image, network, volumes, etc.) and host_config.
|
|
79
119
|
*
|
|
80
|
-
* @param docker - Docker configuration
|
|
120
|
+
* @param docker - Docker configuration (merged agent + fleet config)
|
|
81
121
|
* @returns Fully resolved DockerConfig
|
|
82
122
|
*/
|
|
83
123
|
export function resolveDockerConfig(docker) {
|
|
@@ -88,11 +128,18 @@ export function resolveDockerConfig(docker) {
|
|
|
88
128
|
network: docker?.network ?? "bridge",
|
|
89
129
|
memoryBytes: parseMemoryToBytes(docker?.memory ?? DEFAULT_MEMORY_LIMIT),
|
|
90
130
|
cpuShares: docker?.cpu_shares,
|
|
131
|
+
cpuPeriod: docker?.cpu_period,
|
|
132
|
+
cpuQuota: docker?.cpu_quota,
|
|
91
133
|
user: docker?.user ?? getHostUser(),
|
|
92
134
|
maxContainers: docker?.max_containers ?? DEFAULT_MAX_CONTAINERS,
|
|
93
135
|
volumes: docker?.volumes?.map(parseVolumeMount) ?? [],
|
|
94
136
|
workspaceMode: docker?.workspace_mode ?? "rw",
|
|
95
137
|
env: docker?.env ?? {},
|
|
138
|
+
ports: docker?.ports?.map(parsePortBinding) ?? [],
|
|
139
|
+
tmpfs: docker?.tmpfs?.map(parseTmpfsMount) ?? [],
|
|
140
|
+
pidsLimit: docker?.pids_limit,
|
|
141
|
+
labels: docker?.labels ?? {},
|
|
142
|
+
hostConfigOverride: docker?.host_config,
|
|
96
143
|
};
|
|
97
144
|
}
|
|
98
145
|
//# sourceMappingURL=docker-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker-config.js","sourceRoot":"","sources":["../../../src/runner/runtime/docker-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"docker-config.js","sourceRoot":"","sources":["../../../src/runner/runtime/docker-config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@herdctl/core",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Core library for herdctl fleet management",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"zod": "^3.22.0"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {
|
|
23
|
-
"@herdctl/discord": "0.1.
|
|
23
|
+
"@herdctl/discord": "0.1.7"
|
|
24
24
|
},
|
|
25
25
|
"peerDependenciesMeta": {
|
|
26
26
|
"@herdctl/discord": {
|