@hyzyn/dsh-docker 0.13.7 → 0.14.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/README.en.md +192 -7
- package/README.md +162 -7
- package/client-src/docker.css +477 -0
- package/client-src/index.js +1562 -12
- package/client.js +505 -25
- package/lib/diagnose.d.ts +148 -0
- package/lib/diagnose.js +571 -0
- package/lib/diagnose.js.map +1 -0
- package/lib/docker.d.ts +257 -2
- package/lib/docker.js +464 -4
- package/lib/docker.js.map +1 -1
- package/lib/history-store.d.ts +48 -0
- package/lib/history-store.js +187 -0
- package/lib/history-store.js.map +1 -0
- package/lib/history.d.ts +110 -0
- package/lib/history.js +271 -0
- package/lib/history.js.map +1 -0
- package/lib/index.d.ts +13 -0
- package/lib/index.js +778 -1
- package/lib/index.js.map +1 -1
- package/lib/recreate.d.ts +49 -0
- package/lib/recreate.js +305 -0
- package/lib/recreate.js.map +1 -0
- package/package.json +2 -2
- package/scripts/client-smoke.mjs +916 -0
- package/scripts/route-smoke.mjs +289 -8
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @hyzyn/dsh-docker — 「现场还原」:从 inspect 的原始 JSON 反推等价 `docker run`(纯函数,零 IO)。
|
|
3
|
+
*
|
|
4
|
+
* 为什么是独立模块、而且**不扩 `ContainerDetail`**:还原需要 env / binds / hostConfig,
|
|
5
|
+
* 而 `ContainerDetail` 是「面板详情页显示什么」的契约——把 env 塞进去会顺带把
|
|
6
|
+
* **凭证原值**灌进 `docker_inspect` 的模型上下文。所以这条能力只吃原始 inspect 行,
|
|
7
|
+
* 产出也是纯文本;`ContainerDetail` 一个字都不动。
|
|
8
|
+
*
|
|
9
|
+
* **取向:宁可不还原,也不静默丢**。凡是本模块故意没还原的东西(`--privileged`、
|
|
10
|
+
* 匿名卷、自定义 entrypoint、健康检查…)都会进 `omitted` 点名,让人知道「这条命令
|
|
11
|
+
* 和原容器还不完全等价」。同样地,env 原值**原样保留**(否则命令直接不可用),但命中
|
|
12
|
+
* 敏感键名的会进 `secretKeys`,由调用方在界面上警告——**不改写值**(改写了就不是
|
|
13
|
+
* 等价命令了,而复制粘贴的人会以为那是真值)。
|
|
14
|
+
*/
|
|
15
|
+
/** 还原结果(HTTP 契约 / agent 工具共用;字段顺序即渲染顺序)。 */
|
|
16
|
+
export interface RecreateResult {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
/** 多行 `docker run` 命令(每参数一段、行尾 `\`),可直接复制粘贴。 */
|
|
20
|
+
command: string;
|
|
21
|
+
/** 使用这条命令前必须知道的事(Compose 近似、凭证、网络要先存在)。 */
|
|
22
|
+
warnings: string[];
|
|
23
|
+
/** 名字看起来像凭证的环境变量键(**值不在其中、也不被改写**)。 */
|
|
24
|
+
secretKeys: string[];
|
|
25
|
+
/** 故意没还原的东西(含原因 / 建议怎么补),一条一句。 */
|
|
26
|
+
omitted: string[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 一个参数按 POSIX 规则转义:安全字符原样、其余用单引号包住(`'` → `'\''`),空值给 `''`。
|
|
30
|
+
*
|
|
31
|
+
* 刻意**不**无脑全加单引号:`--name 'shop-web-1'` 读起来噪音很大,而这一行是给人看、
|
|
32
|
+
* 给人复制的。判据取「不需要转义的字符集」——凡不在其中就进引号,行为仍然安全。
|
|
33
|
+
*/
|
|
34
|
+
export declare function shellArg(value: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* 把若干参数拼成多行命令:第一段(`docker run -d`)单独一行,其余每参数一行、行尾 `\`。
|
|
37
|
+
*
|
|
38
|
+
* 为什么一行一个参数:环境变量、端口、卷里经常夹着很长的串,挤在一行既读不出结构,
|
|
39
|
+
* 复制到终端后也不好判断哪段属于哪个参数。
|
|
40
|
+
*/
|
|
41
|
+
export declare function joinCommand(parts: readonly string[]): string;
|
|
42
|
+
/**
|
|
43
|
+
* 从 `docker inspect` 的**单条**原始 JSON 行反推等价 `docker run`。
|
|
44
|
+
*
|
|
45
|
+
* 参数顺序与 `docs`/契约一致:`-d` → `--name` → `--restart` → 端口 → 挂载 → 网络 →
|
|
46
|
+
* `-e` → `--user/--workdir/--hostname` → 资源 → 能力/设备 → 镜像与命令。
|
|
47
|
+
* (ENTRYPOINT 一档刻意留空,原因见 `omittedArgs`。)
|
|
48
|
+
*/
|
|
49
|
+
export declare function buildRunCommand(rawInspectRow: unknown): RecreateResult;
|
package/lib/recreate.js
ADDED
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 环境变量里「像凭证」的键名判据。
|
|
3
|
+
*
|
|
4
|
+
* 只用来**提示**(值照样原样写进命令):误报的代价是一条警告,漏报的代价是用户把带
|
|
5
|
+
* 凭证的命令贴进 issue。所以宁可宽一点。
|
|
6
|
+
*/
|
|
7
|
+
const SECRET_KEY_RE = /(?:PASS|PWD|SECRET|TOKEN|KEY|CRED|AUTH|PRIVATE)/i;
|
|
8
|
+
/** 匿名卷的名字就是 64 位十六进制(docker 自动生成,没有稳定语义)。 */
|
|
9
|
+
const ANONYMOUS_VOLUME_RE = /^[0-9a-f]{64}$/i;
|
|
10
|
+
/** 这些网络模式下不写 `--network`(docker 的默认值 / 无意义值)。 */
|
|
11
|
+
const DEFAULT_NETWORK_MODES = new Set(['', 'default', 'bridge', 'none']);
|
|
12
|
+
/** 这些日志驱动是「没设置」时的默认值,不用还原。 */
|
|
13
|
+
const DEFAULT_LOG_DRIVERS = new Set(['', 'json-file', 'journald']);
|
|
14
|
+
function asRecord(value) {
|
|
15
|
+
return typeof value === 'object' && value !== null ? value : {};
|
|
16
|
+
}
|
|
17
|
+
function asString(value) {
|
|
18
|
+
return typeof value === 'string' ? value : '';
|
|
19
|
+
}
|
|
20
|
+
function asStringArray(value) {
|
|
21
|
+
return Array.isArray(value) ? value.filter((item) => typeof item === 'string') : [];
|
|
22
|
+
}
|
|
23
|
+
function asNumber(value) {
|
|
24
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 一个参数按 POSIX 规则转义:安全字符原样、其余用单引号包住(`'` → `'\''`),空值给 `''`。
|
|
28
|
+
*
|
|
29
|
+
* 刻意**不**无脑全加单引号:`--name 'shop-web-1'` 读起来噪音很大,而这一行是给人看、
|
|
30
|
+
* 给人复制的。判据取「不需要转义的字符集」——凡不在其中就进引号,行为仍然安全。
|
|
31
|
+
*/
|
|
32
|
+
export function shellArg(value) {
|
|
33
|
+
if (value === '')
|
|
34
|
+
return "''";
|
|
35
|
+
if (/^[A-Za-z0-9_@%+=:,./-]+$/.test(value))
|
|
36
|
+
return value;
|
|
37
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 把若干参数拼成多行命令:第一段(`docker run -d`)单独一行,其余每参数一行、行尾 `\`。
|
|
41
|
+
*
|
|
42
|
+
* 为什么一行一个参数:环境变量、端口、卷里经常夹着很长的串,挤在一行既读不出结构,
|
|
43
|
+
* 复制到终端后也不好判断哪段属于哪个参数。
|
|
44
|
+
*/
|
|
45
|
+
export function joinCommand(parts) {
|
|
46
|
+
if (parts.length === 0)
|
|
47
|
+
return '';
|
|
48
|
+
return parts
|
|
49
|
+
.map((part, index) => `${index === 0 ? '' : ' '}${part}${index === parts.length - 1 ? '' : ' \\'}`)
|
|
50
|
+
.join('\n');
|
|
51
|
+
}
|
|
52
|
+
/** 容器名(inspect 的 `.Name` 带前导斜杠)。 */
|
|
53
|
+
function containerName(row) {
|
|
54
|
+
return asString(row.Name).replace(/^\//, '');
|
|
55
|
+
}
|
|
56
|
+
/** 端口绑定:`-p hostIp?:hostPort:containerPort/proto`;只暴露不绑定的用 `--expose`。 */
|
|
57
|
+
function portArgs(config, hostConfig, omitted) {
|
|
58
|
+
const args = [];
|
|
59
|
+
const bindings = asRecord(hostConfig.PortBindings);
|
|
60
|
+
const exposed = asRecord(config.ExposedPorts);
|
|
61
|
+
const bound = new Set();
|
|
62
|
+
for (const [containerPort, rawList] of Object.entries(bindings)) {
|
|
63
|
+
const list = Array.isArray(rawList) ? rawList : [];
|
|
64
|
+
const usable = list.map((item) => asRecord(item)).filter((item) => asString(item.HostPort) !== '');
|
|
65
|
+
if (usable.length === 0)
|
|
66
|
+
continue;
|
|
67
|
+
bound.add(containerPort);
|
|
68
|
+
for (const binding of usable) {
|
|
69
|
+
const hostIp = asString(binding.HostIp);
|
|
70
|
+
const hostPort = asString(binding.HostPort);
|
|
71
|
+
args.push(`-p ${hostIp === '' ? '' : `${hostIp}:`}${hostPort}:${containerPort}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
for (const port of Object.keys(exposed)) {
|
|
75
|
+
if (bound.has(port))
|
|
76
|
+
continue;
|
|
77
|
+
// `--expose` 只接受端口(`8080`),tcp 可省;udp / sctp 要带协议
|
|
78
|
+
const [number = '', proto = 'tcp'] = port.split('/');
|
|
79
|
+
args.push(`--expose ${proto === 'tcp' ? number : `${number}/${proto}`}`);
|
|
80
|
+
}
|
|
81
|
+
// 端口区间(`8000-8005/tcp`)在 `-p` 里是合法的,原样透传即可;但若某个绑定既没 hostPort
|
|
82
|
+
// 又不是合法的 `-p` 形状,这里点名而不是猜。
|
|
83
|
+
for (const [containerPort, rawList] of Object.entries(bindings)) {
|
|
84
|
+
const list = Array.isArray(rawList) ? rawList : [];
|
|
85
|
+
if (list.length === 0)
|
|
86
|
+
continue;
|
|
87
|
+
if (list.some((item) => asString(asRecord(item).HostPort) === '')) {
|
|
88
|
+
omitted.push(`端口 ${containerPort} 的绑定缺少宿主端口信息,未还原`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return args;
|
|
92
|
+
}
|
|
93
|
+
/** 挂载:bind → `-v src:dest`、named volume → `-v name:dest`、tmpfs → `--tmpfs dest`。 */
|
|
94
|
+
function mountArgs(hostConfig, row, omitted, warnings) {
|
|
95
|
+
const args = [];
|
|
96
|
+
const mounts = Array.isArray(row.Mounts) ? row.Mounts.map((item) => asRecord(item)) : [];
|
|
97
|
+
const used = new Set();
|
|
98
|
+
for (const mount of mounts) {
|
|
99
|
+
const type = asString(mount.Type);
|
|
100
|
+
const destination = asString(mount.Destination);
|
|
101
|
+
const readOnly = mount.RW === false;
|
|
102
|
+
const suffix = readOnly ? ':ro' : '';
|
|
103
|
+
if (type === 'bind') {
|
|
104
|
+
const source = asString(mount.Source);
|
|
105
|
+
if (source === '' || destination === '')
|
|
106
|
+
continue;
|
|
107
|
+
args.push(`-v ${shellArg(`${source}:${destination}${suffix}`)}`);
|
|
108
|
+
used.add(`${type}:${destination}`);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (type === 'volume') {
|
|
112
|
+
const name = asString(mount.Name);
|
|
113
|
+
if (name === '' || destination === '')
|
|
114
|
+
continue;
|
|
115
|
+
if (ANONYMOUS_VOLUME_RE.test(name)) {
|
|
116
|
+
omitted.push(`匿名卷 ${destination} 未还原(名字 ${name} 是 docker 自动生成的,迁移时应改成命名卷)`);
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
args.push(`-v ${shellArg(`${name}:${destination}${suffix}`)}`);
|
|
120
|
+
used.add(`${type}:${destination}`);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (type === 'tmpfs') {
|
|
124
|
+
if (destination === '')
|
|
125
|
+
continue;
|
|
126
|
+
args.push(`--tmpfs ${shellArg(destination)}`);
|
|
127
|
+
used.add(`${type}:${destination}`);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (destination !== '')
|
|
131
|
+
omitted.push(`特殊挂载 ${destination}(类型 ${type === '' ? '未知' : type})未还原`);
|
|
132
|
+
}
|
|
133
|
+
// HostConfig.Binds 里有、Mounts 里没有的条目:docker 版本差异时会漏,点名而不是静默丢
|
|
134
|
+
const binds = asStringArray(hostConfig.Binds);
|
|
135
|
+
if (binds.length > mounts.filter((mount) => asString(mount.Source) !== '' || asString(mount.Name) !== '').length) {
|
|
136
|
+
warnings.push('部分 -v 绑定来自 HostConfig.Binds 且没有对应的 Mounts 条目,可能没有还原完整');
|
|
137
|
+
}
|
|
138
|
+
return args;
|
|
139
|
+
}
|
|
140
|
+
/** 资源限制:内存 / CPU(纳核 → 核)。 */
|
|
141
|
+
function resourceArgs(hostConfig) {
|
|
142
|
+
const args = [];
|
|
143
|
+
const memory = asNumber(hostConfig.Memory);
|
|
144
|
+
if (memory !== null && memory > 0)
|
|
145
|
+
args.push(`--memory ${String(memory)}`);
|
|
146
|
+
const nanoCpus = asNumber(hostConfig.NanoCpus);
|
|
147
|
+
if (nanoCpus !== null && nanoCpus > 0) {
|
|
148
|
+
const cores = Math.round((nanoCpus / 1e9) * 1000) / 1000;
|
|
149
|
+
args.push(`--cpus ${String(cores)}`);
|
|
150
|
+
}
|
|
151
|
+
return args;
|
|
152
|
+
}
|
|
153
|
+
/** 能力 / 设备。 */
|
|
154
|
+
function capabilityArgs(hostConfig) {
|
|
155
|
+
const args = [];
|
|
156
|
+
for (const cap of asStringArray(hostConfig.CapAdd))
|
|
157
|
+
args.push(`--cap-add ${shellArg(cap)}`);
|
|
158
|
+
for (const cap of asStringArray(hostConfig.CapDrop))
|
|
159
|
+
args.push(`--cap-drop ${shellArg(cap)}`);
|
|
160
|
+
const devices = Array.isArray(hostConfig.Devices) ? hostConfig.Devices.map((item) => asRecord(item)) : [];
|
|
161
|
+
for (const device of devices) {
|
|
162
|
+
const host = asString(device.PathOnHost);
|
|
163
|
+
const inside = asString(device.PathInContainer);
|
|
164
|
+
const permissions = asString(device.CgroupPermissions);
|
|
165
|
+
if (host === '')
|
|
166
|
+
continue;
|
|
167
|
+
// 三个字段全写出来(`host:inside:perm`):等价性优先于「能省则省」,
|
|
168
|
+
// 少写一段在 docker 里会被解释成别的意思
|
|
169
|
+
const spec = inside === '' ? host : `${host}:${inside}`;
|
|
170
|
+
args.push(`--device ${shellArg(permissions === '' ? spec : `${spec}:${permissions}`)}`);
|
|
171
|
+
}
|
|
172
|
+
return args;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* 「故意没还原」的清单:每一条都要说清**是什么**以及**怎么补**,不写「暂不支持」这种废话。
|
|
176
|
+
*
|
|
177
|
+
* 判据统一是「有具体信息能指出来的」:`--privileged`、`--link`、自定义日志驱动、
|
|
178
|
+
* 非默认的 pid / ipc / uts、sysctl、安全选项、ENTRYPOINT 覆盖、健康检查。
|
|
179
|
+
*/
|
|
180
|
+
function omittedArgs(config, hostConfig, omitted) {
|
|
181
|
+
if (hostConfig.Privileged === true) {
|
|
182
|
+
omitted.push('--privileged 未还原:风险高,需要你人工确认后自己加');
|
|
183
|
+
}
|
|
184
|
+
if (asStringArray(hostConfig.Links).length > 0) {
|
|
185
|
+
omitted.push(`--link 未还原(${asStringArray(hostConfig.Links).join('、')}):--link 已废弃,建议改用自定义网络`);
|
|
186
|
+
}
|
|
187
|
+
const logType = asString(asRecord(hostConfig.LogConfig).Type);
|
|
188
|
+
if (!DEFAULT_LOG_DRIVERS.has(logType)) {
|
|
189
|
+
omitted.push(`日志驱动 ${logType} 未还原(默认驱动不会写进命令)`);
|
|
190
|
+
}
|
|
191
|
+
const pidMode = asString(hostConfig.PidMode);
|
|
192
|
+
if (pidMode !== '' && pidMode !== 'private')
|
|
193
|
+
omitted.push(`--pid ${pidMode} 未还原`);
|
|
194
|
+
const ipcMode = asString(hostConfig.IpcMode);
|
|
195
|
+
if (ipcMode !== '' && ipcMode !== 'private' && ipcMode !== 'shareable')
|
|
196
|
+
omitted.push(`--ipc ${ipcMode} 未还原`);
|
|
197
|
+
const utsMode = asString(hostConfig.UtsMode);
|
|
198
|
+
if (utsMode !== '' && utsMode !== 'private')
|
|
199
|
+
omitted.push(`--uts ${utsMode} 未还原`);
|
|
200
|
+
const sysctls = asRecord(hostConfig.Sysctls);
|
|
201
|
+
if (Object.keys(sysctls).length > 0)
|
|
202
|
+
omitted.push(`--sysctl 未还原(${Object.keys(sysctls).join('、')})`);
|
|
203
|
+
const extraHosts = asStringArray(hostConfig.ExtraHosts);
|
|
204
|
+
if (extraHosts.length > 0)
|
|
205
|
+
omitted.push(`--add-host 未还原(${extraHosts.join('、')})`);
|
|
206
|
+
const securityOpt = asStringArray(hostConfig.SecurityOpt);
|
|
207
|
+
if (securityOpt.length > 0)
|
|
208
|
+
omitted.push(`--security-opt 未还原(${securityOpt.join('、')})`);
|
|
209
|
+
const entrypoint = asStringArray(config.Entrypoint);
|
|
210
|
+
if (entrypoint.length > 0) {
|
|
211
|
+
// 容器 inspect 里没有镜像自身的 ENTRYPOINT,无法确认这是「镜像自带」还是「被覆盖」——
|
|
212
|
+
// 猜错的代价是复制出一条跑不起来的命令,所以宁可不写、只点名。
|
|
213
|
+
omitted.push(`ENTRYPOINT 未还原(容器里是 ${entrypoint.join(' ')},可能来自镜像本身;若你确实用 --entrypoint 覆盖过,请手动补上)`);
|
|
214
|
+
}
|
|
215
|
+
const healthcheck = asRecord(config.Healthcheck);
|
|
216
|
+
if (asStringArray(healthcheck.Test).length > 0) {
|
|
217
|
+
omitted.push('自定义健康检查未还原(重建后容器没有这条探针;镜像自带的探针不受影响)');
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* 从 `docker inspect` 的**单条**原始 JSON 行反推等价 `docker run`。
|
|
222
|
+
*
|
|
223
|
+
* 参数顺序与 `docs`/契约一致:`-d` → `--name` → `--restart` → 端口 → 挂载 → 网络 →
|
|
224
|
+
* `-e` → `--user/--workdir/--hostname` → 资源 → 能力/设备 → 镜像与命令。
|
|
225
|
+
* (ENTRYPOINT 一档刻意留空,原因见 `omittedArgs`。)
|
|
226
|
+
*/
|
|
227
|
+
export function buildRunCommand(rawInspectRow) {
|
|
228
|
+
const row = asRecord(rawInspectRow);
|
|
229
|
+
const config = asRecord(row.Config);
|
|
230
|
+
const hostConfig = asRecord(row.HostConfig);
|
|
231
|
+
const id = asString(row.Id === undefined ? row.ID : row.Id);
|
|
232
|
+
const name = containerName(row);
|
|
233
|
+
if (id === '' && name === '') {
|
|
234
|
+
throw new Error('无法解析容器配置:inspect 里既没有 Id 也没有 Name');
|
|
235
|
+
}
|
|
236
|
+
const parts = ['docker run -d', `--name ${shellArg(name === '' ? id.slice(0, 12) : name)}`];
|
|
237
|
+
const omitted = [];
|
|
238
|
+
const warnings = [];
|
|
239
|
+
const restart = asRecord(hostConfig.RestartPolicy);
|
|
240
|
+
const restartName = asString(restart.Name);
|
|
241
|
+
if (restartName !== '' && restartName !== 'no') {
|
|
242
|
+
const retries = asNumber(restart.MaximumRetryCount);
|
|
243
|
+
parts.push(`--restart ${retries !== null && restartName === 'on-failure' && retries > 0 ? `${restartName}:${String(retries)}` : restartName}`);
|
|
244
|
+
}
|
|
245
|
+
for (const arg of portArgs(config, hostConfig, omitted))
|
|
246
|
+
parts.push(arg);
|
|
247
|
+
for (const arg of mountArgs(hostConfig, row, omitted, warnings))
|
|
248
|
+
parts.push(arg);
|
|
249
|
+
const network = asString(hostConfig.NetworkMode);
|
|
250
|
+
if (!DEFAULT_NETWORK_MODES.has(network)) {
|
|
251
|
+
parts.push(`--network ${shellArg(network)}`);
|
|
252
|
+
// Compose 建的网络在 `docker compose down` 之后会消失:重建前先确认它还在
|
|
253
|
+
if (network.endsWith('_default')) {
|
|
254
|
+
warnings.push(`网络 ${network} 可能是 Compose 创建的:重建前先确认它存在(或先起一次 compose)`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const env = asStringArray(config.Env);
|
|
258
|
+
const secretKeys = [];
|
|
259
|
+
for (const entry of env) {
|
|
260
|
+
parts.push(`-e ${shellArg(entry)}`);
|
|
261
|
+
const at = entry.indexOf('=');
|
|
262
|
+
const key = at === -1 ? entry : entry.slice(0, at);
|
|
263
|
+
if (SECRET_KEY_RE.test(key))
|
|
264
|
+
secretKeys.push(key);
|
|
265
|
+
}
|
|
266
|
+
if (secretKeys.length > 0) {
|
|
267
|
+
warnings.push('环境变量原值会出现在命令里,可能包含凭证;贴到公开位置前先确认');
|
|
268
|
+
}
|
|
269
|
+
const user = asString(config.User);
|
|
270
|
+
if (user !== '')
|
|
271
|
+
parts.push(`--user ${shellArg(user)}`);
|
|
272
|
+
const workingDir = asString(config.WorkingDir);
|
|
273
|
+
if (workingDir !== '')
|
|
274
|
+
parts.push(`--workdir ${shellArg(workingDir)}`);
|
|
275
|
+
const hostname = asString(config.Hostname);
|
|
276
|
+
// docker 会把主机名默认设成容器 ID 前 12 位:那种情况是「没设置」,不该写进命令
|
|
277
|
+
if (hostname !== '' && hostname !== id.slice(0, 12))
|
|
278
|
+
parts.push(`--hostname ${shellArg(hostname)}`);
|
|
279
|
+
for (const arg of resourceArgs(hostConfig))
|
|
280
|
+
parts.push(arg);
|
|
281
|
+
for (const arg of capabilityArgs(hostConfig))
|
|
282
|
+
parts.push(arg);
|
|
283
|
+
omittedArgs(config, hostConfig, omitted);
|
|
284
|
+
const image = asString(config.Image);
|
|
285
|
+
if (image === '') {
|
|
286
|
+
throw new Error('无法解析容器配置:inspect 里没有 Config.Image');
|
|
287
|
+
}
|
|
288
|
+
parts.push(shellArg(image));
|
|
289
|
+
for (const arg of asStringArray(config.Cmd))
|
|
290
|
+
parts.push(shellArg(arg));
|
|
291
|
+
const composeProject = asString(asRecord(config.Labels)['com.docker.compose.project']);
|
|
292
|
+
if (composeProject !== '') {
|
|
293
|
+
warnings.push(`该容器由 Compose 项目 ${composeProject} 管理:等价命令只是近似(网络别名 / labels / depends_on 不在其中),长期运维建议改回 compose`);
|
|
294
|
+
}
|
|
295
|
+
return {
|
|
296
|
+
id: id === '' ? name : id,
|
|
297
|
+
name: name === '' ? id.slice(0, 12) : name,
|
|
298
|
+
// 第一行 `docker run -d` 已经带了两个参数,多行拼接时与其余参数同构
|
|
299
|
+
command: joinCommand(parts),
|
|
300
|
+
warnings,
|
|
301
|
+
secretKeys,
|
|
302
|
+
omitted,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=recreate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recreate.js","sourceRoot":"","sources":["../src/recreate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyzyn/dsh-docker",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "DSH Web GUI 的 Docker 容器面板插件:本机或 SSH 主机上的容器列表 / 启停删 / 日志 / 统计 / 镜像 / 一次性 exec,默认只读,配套只读优先的 agent 工具。",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dsh",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"@deepseek-ai/schemastery": "^3.18.4",
|
|
47
|
-
"@hyzyn/dsh-kit": "0.7.
|
|
47
|
+
"@hyzyn/dsh-kit": "0.7.4",
|
|
48
48
|
"ssh2": "^1.17.0"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|