signalk-container 1.30.0 → 1.31.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/AGENTS.md +8 -0
- package/dist/containers.d.ts +95 -13
- package/dist/containers.d.ts.map +1 -1
- package/dist/containers.js +255 -28
- package/dist/containers.js.map +1 -1
- package/dist/devices.d.ts +55 -3
- package/dist/devices.d.ts.map +1 -1
- package/dist/devices.js +100 -15
- package/dist/devices.js.map +1 -1
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +75 -6
- package/dist/index.js.map +1 -1
- package/dist/namespace.d.ts +9 -0
- package/dist/namespace.d.ts.map +1 -1
- package/dist/namespace.js +11 -0
- package/dist/namespace.js.map +1 -1
- package/dist/types.d.ts +59 -0
- package/dist/types.d.ts.map +1 -1
- package/doc/plugin-developer-guide.md +74 -3
- package/package.json +5 -4
- package/public/chunks/_virtual_mf-localSharedImportMap___mfe_internal__signalk_container__mf_owner__1-COEdWfIZ.js +1 -0
- package/public/chunks/dist-S2EeZB5F.js +4 -0
- package/public/chunks/{hostInit-B9SMrbCX.js → hostInit-D-1ZoiV2.js} +1 -1
- package/public/remoteEntry.js +1 -1
- package/public/chunks/_virtual_mf-localSharedImportMap___mfe_internal__signalk_container__mf_owner__1-CfjL8DWB.js +0 -1
- package/public/chunks/dist-CMZwYQxm.js +0 -4
package/AGENTS.md
CHANGED
|
@@ -42,6 +42,14 @@ Do not add error handling, fallbacks, or validation for scenarios that cannot ha
|
|
|
42
42
|
- `npm test` — unit only (`dist/test/*.test.js`, no recursion). Safe to run anywhere.
|
|
43
43
|
- `npm run test:integration` — integration only (`dist/test/integration/*.test.js`). Requires podman or docker; tests still self-skip on Windows and when no runtime is found.
|
|
44
44
|
- `npm run test:all` — both. The pre-PR full sweep on a dev box.
|
|
45
|
+
- **Known Windows CI flake.** `node --test` intermittently marks a whole test
|
|
46
|
+
file failed with a bare `'test failed'` at `:1:1` while every assertion
|
|
47
|
+
inside it passed — the file's child process exits non-zero after its work
|
|
48
|
+
completes. It is not tied to any particular file or to the change under
|
|
49
|
+
test, and `--test-concurrency=1` does not prevent it. Diagnose it by
|
|
50
|
+
checking whether the reported file's own tests all show ✔; if they do,
|
|
51
|
+
re-run the job. `npm test` writes `test-results/junit.xml`, which plugin-CI
|
|
52
|
+
uploads as an artifact — attach that to any upstream report.
|
|
45
53
|
- All new code requires tests. Test behavior at the function boundary, not internal control flow.
|
|
46
54
|
- Inject `client: ContainerClient = getClient()` rather than calling dockerode directly. Tests stub via `makeMockClient(spec)` from `src/test/helpers/mockClient.ts`. See `src/test/getLiveResources.test.ts` for the canonical pattern: a mock whose `getContainer().inspect()` returns the JSON object under test, no real podman/docker invocations.
|
|
47
55
|
- Container-integration tests (those that actually pull `alpine:3.19`) live under `src/test/integration/` and gate on `hasContainerRuntime()` which returns `null` on Windows. Do not add new tests that pull real Linux images without putting them under `src/test/integration/` AND gating on the helper.
|
package/dist/containers.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type Docker from "dockerode";
|
|
2
|
-
import { ContainerConfig, ContainerInfo, ContainerRuntimeInfo, ContainerState, DeviceIssue, EnsureRunningOptions, LocalImageSummary, ManagedImageRef, NofileLimits, PruneResult, ContainerWedged, ResourceClamp, UlimitClamp, VolumeIssue, VolumeSpec } from "./types.js";
|
|
2
|
+
import { ContainerConfig, ContainerInfo, ContainerRuntimeInfo, ContainerState, DeviceIssue, EnsureRunningOptions, LocalImageSummary, ManagedImageRef, NofileLimits, PruneResult, ContainerStateDetail, RequestedConfigProvenance, ContainerWedged, ResourceClamp, UlimitClamp, VolumeIssue, VolumeSpec } from "./types.js";
|
|
3
3
|
import { StreamingProcessHandle } from "./runtime.js";
|
|
4
4
|
import { type ContainerClient } from "./client.js";
|
|
5
5
|
import { type ErrorKind } from "./errors.js";
|
|
@@ -84,7 +84,17 @@ export declare function resolveHostTimezone(systemZone?: () => string): string |
|
|
|
84
84
|
* `defaultHomeForConfigRoot`.
|
|
85
85
|
*/
|
|
86
86
|
export declare function defaultTimezoneEnv(env: Record<string, string> | undefined, zone: string | undefined): Record<string, string> | undefined;
|
|
87
|
-
|
|
87
|
+
/**
|
|
88
|
+
* What a host-source probe could establish about a path.
|
|
89
|
+
*
|
|
90
|
+
* `"unknown"` is NOT a synonym for absent. When the manager runs inside a
|
|
91
|
+
* container its filesystem is not the one the runtime resolves bind sources
|
|
92
|
+
* against, so `existsSync` on a host path answers a different question than
|
|
93
|
+
* the one asked. Reporting that as absent drops a volume whose source is
|
|
94
|
+
* perfectly real — the bug this type exists to prevent.
|
|
95
|
+
*/
|
|
96
|
+
export type VolumeSourceState = boolean | "unknown";
|
|
97
|
+
export declare function classifyVolumeSources(volumes: Record<string, string | VolumeSpec> | undefined, probe?: (path: string) => VolumeSourceState): {
|
|
88
98
|
kept: Record<string, string>;
|
|
89
99
|
skipped: Array<{
|
|
90
100
|
containerPath: string;
|
|
@@ -94,6 +104,11 @@ export declare function classifyVolumeSources(volumes: Record<string, string | V
|
|
|
94
104
|
containerPath: string;
|
|
95
105
|
source: string;
|
|
96
106
|
}>;
|
|
107
|
+
/** Host paths whose existence could not be established. Kept, not dropped. */
|
|
108
|
+
unverified: Array<{
|
|
109
|
+
containerPath: string;
|
|
110
|
+
source: string;
|
|
111
|
+
}>;
|
|
97
112
|
};
|
|
98
113
|
/**
|
|
99
114
|
* Given the volume issues from the last `ensureRunning` call (both
|
|
@@ -325,6 +340,19 @@ export declare function getLiveContainerDigest(runtime: ContainerRuntimeInfo, co
|
|
|
325
340
|
*/
|
|
326
341
|
export declare function pullImage(runtime: ContainerRuntimeInfo, image: string, onProgress?: (msg: string) => void, client?: ContainerClient): Promise<void>;
|
|
327
342
|
export declare function getContainerState(runtime: ContainerRuntimeInfo, name: string, client?: ContainerClient): Promise<ContainerState>;
|
|
343
|
+
/**
|
|
344
|
+
* Coarse state plus the detail that explains it — exit code, OOM kill,
|
|
345
|
+
* restart count and the container's own healthcheck verdict.
|
|
346
|
+
*
|
|
347
|
+
* `getContainerState` answers "can I talk to it"; this answers "why is
|
|
348
|
+
* it like that". Both read the same `State` block from one inspect, and
|
|
349
|
+
* share `coarseStateFrom` so the two can never disagree about running.
|
|
350
|
+
*
|
|
351
|
+
* Returns `state: "missing"` with no detail when the container is gone.
|
|
352
|
+
* Individual fields stay undefined when the runtime omits them rather
|
|
353
|
+
* than defaulting to a zero that would read as real data.
|
|
354
|
+
*/
|
|
355
|
+
export declare function getContainerStateDetail(name: string, client?: ContainerClient): Promise<ContainerStateDetail>;
|
|
328
356
|
/**
|
|
329
357
|
* Upper bound on the `.State.Error` text surfaced to callers. Some OCI
|
|
330
358
|
* runtime rejections embed multi-kilobyte detail (spec dumps, nested
|
|
@@ -377,6 +405,19 @@ export declare function getLiveResources(runtime: ContainerRuntimeInfo, name: st
|
|
|
377
405
|
* current-vs-target check minus runtime-injected fields.
|
|
378
406
|
*/
|
|
379
407
|
export declare function getRequestedResources(name: string, client?: ContainerClient): Promise<import("./types.js").ContainerResourceLimits | undefined>;
|
|
408
|
+
/**
|
|
409
|
+
* Parse the requested-config provenance label written at create time.
|
|
410
|
+
*
|
|
411
|
+
* Returns `undefined` — meaning "no provenance", so the caller keeps
|
|
412
|
+
* today's positive-only drift behaviour — when the label is absent,
|
|
413
|
+
* unparseable, or not an object. It must never return `{}` for a
|
|
414
|
+
* missing label: an empty provenance reads as "the container was
|
|
415
|
+
* created with no env at all", which would mask a genuine unset.
|
|
416
|
+
*
|
|
417
|
+
* Never throws. A hand-edited or truncated label degrades to
|
|
418
|
+
* `undefined` rather than breaking `ensureRunning`.
|
|
419
|
+
*/
|
|
420
|
+
export declare function parseRequestedConfigLabel(raw: string | undefined): RequestedConfigProvenance | undefined;
|
|
380
421
|
/**
|
|
381
422
|
* One host-side endpoint for a single container port. Mirror of the
|
|
382
423
|
* `{ HostIp, HostPort }` shape that podman/docker emit under
|
|
@@ -503,18 +544,20 @@ export declare function getLiveContainerConfig(runtime: ContainerRuntimeInfo, na
|
|
|
503
544
|
* for floating tags (`:latest` digest drift) is the update service's job.
|
|
504
545
|
* - command: explicit drift when `requested.command` is set and differs
|
|
505
546
|
* from `live.command`. When `requested.command` is undefined, drift is
|
|
506
|
-
* reported only if a `
|
|
507
|
-
* unsetting it).
|
|
508
|
-
*
|
|
509
|
-
*
|
|
510
|
-
*
|
|
547
|
+
* reported only if a prior `command` was set (i.e. the user is now
|
|
548
|
+
* unsetting it). The prior comes from the wrapper's `lastConfigs`
|
|
549
|
+
* cache when warm, and otherwise from the create-time provenance
|
|
550
|
+
* label; with neither, an undefined `requested.command` can't be
|
|
551
|
+
* told apart from "image's baked CMD" so we skip.
|
|
511
552
|
* - networkMode: runtime defaults (`bridge`, `slirp4netns`, etc.) are
|
|
512
553
|
* normalized to `""` and compared as equivalent to requested undefined.
|
|
513
554
|
* - env: requested keys must match live values. Additionally, any key
|
|
514
|
-
* present in
|
|
515
|
-
* as drift (the user is unsetting it). Image-baked env keys
|
|
516
|
-
*
|
|
517
|
-
*
|
|
555
|
+
* present in the prior env but absent from `requested.env` is treated
|
|
556
|
+
* as drift (the user is unsetting it). Image-baked env keys in neither
|
|
557
|
+
* `requested.env` nor the prior are ignored — they were never ours.
|
|
558
|
+
* The prior is the warm `lastConfigs` entry, falling back to the env
|
|
559
|
+
* KEY NAMES recorded in the create-time provenance label; values are
|
|
560
|
+
* never recorded there because this check reads only key presence.
|
|
518
561
|
* - volumes: trailing slashes stripped on both sides; `(host, container)`
|
|
519
562
|
* tuples compared as a Map keyed by container path. Live binds have
|
|
520
563
|
* their `:Z`/`:ro` flags already stripped by `getLiveContainerConfig`.
|
|
@@ -612,8 +655,10 @@ export declare function ensureRunning(runtime: ContainerRuntimeInfo, name: strin
|
|
|
612
655
|
* this signalk-container lifetime, if any. Used to detect "unset" drift
|
|
613
656
|
* — env keys removed, `command` previously set and now undefined. The
|
|
614
657
|
* wrapper in `index.ts` reads from its `lastConfigs` cache before
|
|
615
|
-
* overwriting it
|
|
616
|
-
*
|
|
658
|
+
* overwriting it. On the first call (or after a Signal K restart) it
|
|
659
|
+
* is undefined and the diff falls back to the requested-config
|
|
660
|
+
* provenance label stamped at create time, so an unset is still
|
|
661
|
+
* detected across a restart.
|
|
617
662
|
*/
|
|
618
663
|
prior?: ContainerConfig, _postRecreate?: boolean, _pull?: PullFn): Promise<void>;
|
|
619
664
|
export declare function startContainer(runtime: ContainerRuntimeInfo, name: string, client?: ContainerClient): Promise<void>;
|
|
@@ -959,6 +1004,43 @@ export interface ContainerMountResolution {
|
|
|
959
1004
|
* `resolveSignalkDataSource` does for backwards-compat).
|
|
960
1005
|
*/
|
|
961
1006
|
export declare function resolveHostPath(absPath: string, runtime: ContainerRuntimeInfo, debug?: (msg: string) => void, client?: ContainerClient): Promise<ContainerMountResolution | null>;
|
|
1007
|
+
/**
|
|
1008
|
+
* Can `existsSync(hostPath)` be trusted inside this container?
|
|
1009
|
+
*
|
|
1010
|
+
* The caller holds a HOST path and stats that same string locally, so the
|
|
1011
|
+
* mount has to make those two the same thing. Three conditions, and all are
|
|
1012
|
+
* load-bearing:
|
|
1013
|
+
*
|
|
1014
|
+
* - **Bind mounts only.** A named volume's contents are not the host
|
|
1015
|
+
* filesystem at that path, so a file seen inside one proves nothing.
|
|
1016
|
+
* - **Path-preserving only** (`source === dest`). A bind of `/host/data` to
|
|
1017
|
+
* `/data` puts the host's `/host/data` at `/data`; the string `/data` inside
|
|
1018
|
+
* the container names `/host/data` on the host, and the host's own `/data`
|
|
1019
|
+
* is not visible at all. Verified against a real runtime. Trusting such a
|
|
1020
|
+
* mount would let `existsSync("/data/certs")` answer about
|
|
1021
|
+
* `/host/data/certs` and report a nonexistent required source as present --
|
|
1022
|
+
* exactly the `ifMissing: "abort"` failure this guards.
|
|
1023
|
+
* - **Exact-or-child.** A mount at `/data` covers `/data` and `/data/sub`,
|
|
1024
|
+
* never `/database`.
|
|
1025
|
+
*
|
|
1026
|
+
* Factored out of `ownBindMountCoverage` so the rule is testable without a
|
|
1027
|
+
* runtime.
|
|
1028
|
+
*/
|
|
1029
|
+
export declare function isPathUnderBindMount(absPath: string, mounts: readonly InspectedMount[]): boolean;
|
|
1030
|
+
/**
|
|
1031
|
+
* Host paths this container can see truthfully, as a predicate.
|
|
1032
|
+
*
|
|
1033
|
+
* A bind mount makes this container's view of a path the HOST's view at a
|
|
1034
|
+
* known offset, so `existsSync` under one is authoritative in both directions.
|
|
1035
|
+
* Anywhere else a containerized process is looking at a different filesystem
|
|
1036
|
+
* entirely, and neither answer means anything about the host.
|
|
1037
|
+
*
|
|
1038
|
+
* Returns a predicate rather than resolving one path so the inspect happens
|
|
1039
|
+
* ONCE per reconcile instead of once per volume. On bare metal, or when the
|
|
1040
|
+
* self-inspect fails, every path is covered / not covered respectively — the
|
|
1041
|
+
* caller decides what that means.
|
|
1042
|
+
*/
|
|
1043
|
+
export declare function ownBindMountCoverage(runtime: ContainerRuntimeInfo, debug?: (msg: string) => void, client?: ContainerClient): Promise<(absPath: string) => boolean>;
|
|
962
1044
|
/**
|
|
963
1045
|
* Release a port that was reserved by `findAvailablePort()`.
|
|
964
1046
|
* Must be called after the container runtime has successfully bound the port
|
package/dist/containers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containers.d.ts","sourceRoot":"","sources":["../src/containers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"containers.d.ts","sourceRoot":"","sources":["../src/containers.ts"],"names":[],"mappings":"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"}
|
package/dist/containers.js
CHANGED
|
@@ -8,7 +8,7 @@ import { demuxToText, demuxBufferToText, getClient, safe, safeInspect, } from ".
|
|
|
8
8
|
import { describeError, isStorageCorruptError, isUlimitRejectionText, messageWithRaw, } from "./errors.js";
|
|
9
9
|
import { DEVICES_UNRESOLVED_LABEL, filterUnresolvedDeviceEntries, KEEP_ORIGINAL_GROUPS_ANNOTATION, parseUnresolvedDevicesLabel, presentLiveDeviceNodes, resolveDeviceRequests, resolveGroupAdd, unresolvedGroupNames, } from "./devices.js";
|
|
10
10
|
import { parseResourceLimits, resourcePayloadForRun } from "./resources.js";
|
|
11
|
-
import { containerPrefix, requestedResourcesLabel } from "./namespace.js";
|
|
11
|
+
import { containerPrefix, requestedConfigLabel, requestedResourcesLabel, } from "./namespace.js";
|
|
12
12
|
import { classifyTag } from "./updates/tagClassifier.js";
|
|
13
13
|
import { compareVersions } from "./updates/semver.js";
|
|
14
14
|
import { isOfflineError } from "./updates/offline.js";
|
|
@@ -155,8 +155,9 @@ export function classifyVolumeSources(volumes, probe = existsSync) {
|
|
|
155
155
|
const kept = {};
|
|
156
156
|
const skipped = [];
|
|
157
157
|
const aborted = [];
|
|
158
|
+
const unverified = [];
|
|
158
159
|
if (!volumes)
|
|
159
|
-
return { kept, skipped, aborted };
|
|
160
|
+
return { kept, skipped, aborted, unverified };
|
|
160
161
|
for (const [containerPath, raw] of Object.entries(volumes)) {
|
|
161
162
|
const source = typeof raw === "string" ? raw : raw.source;
|
|
162
163
|
const policy = typeof raw === "string" ? "create" : (raw.ifMissing ?? "create");
|
|
@@ -169,10 +170,37 @@ export function classifyVolumeSources(volumes, probe = existsSync) {
|
|
|
169
170
|
continue;
|
|
170
171
|
}
|
|
171
172
|
// Host path: only the missing case differentiates policies.
|
|
172
|
-
|
|
173
|
+
const state = probe(source);
|
|
174
|
+
if (state === true) {
|
|
173
175
|
kept[containerPath] = source;
|
|
174
176
|
continue;
|
|
175
177
|
}
|
|
178
|
+
// Could not tell whether the source exists. Each policy keeps the
|
|
179
|
+
// guarantee it promised, because the runtimes disagree about what a
|
|
180
|
+
// missing bind source does -- verified against both: Docker silently
|
|
181
|
+
// auto-creates an empty directory, podman refuses to start the container
|
|
182
|
+
// (`statfs: no such file or directory`).
|
|
183
|
+
//
|
|
184
|
+
// `abort` means "cannot run without this" (TLS certs, required state).
|
|
185
|
+
// Keeping it would mount an empty directory where the certs belong and
|
|
186
|
+
// start anyway on Docker -- the exact outcome the policy prevents.
|
|
187
|
+
//
|
|
188
|
+
// `skip` and `create` are kept. Dropping a skip source here is what #245
|
|
189
|
+
// reports: the mount is real and working, and omitting it is the silent
|
|
190
|
+
// failure the caller cannot see. The residual risk -- a source that is
|
|
191
|
+
// genuinely absent AND unverifiable -- is bounded by the probe above,
|
|
192
|
+
// which returns "unknown" only when this process has no bind mount
|
|
193
|
+
// covering the path and therefore cannot be the one to judge.
|
|
194
|
+
if (state === "unknown") {
|
|
195
|
+
if (policy === "abort") {
|
|
196
|
+
aborted.push({ containerPath, source });
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
unverified.push({ containerPath, source });
|
|
200
|
+
kept[containerPath] = source;
|
|
201
|
+
}
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
176
204
|
if (policy === "skip") {
|
|
177
205
|
skipped.push({ containerPath, source });
|
|
178
206
|
}
|
|
@@ -186,7 +214,7 @@ export function classifyVolumeSources(volumes, probe = existsSync) {
|
|
|
186
214
|
kept[containerPath] = source;
|
|
187
215
|
}
|
|
188
216
|
}
|
|
189
|
-
return { kept, skipped, aborted };
|
|
217
|
+
return { kept, skipped, aborted, unverified };
|
|
190
218
|
}
|
|
191
219
|
/**
|
|
192
220
|
* Given the volume issues from the last `ensureRunning` call (both
|
|
@@ -725,21 +753,78 @@ export async function getContainerState(runtime, name, client = getClient()) {
|
|
|
725
753
|
const info = await safeInspect(() => client.getContainer(fullName).inspect());
|
|
726
754
|
if (info === null)
|
|
727
755
|
return "missing";
|
|
728
|
-
|
|
729
|
-
|
|
756
|
+
return coarseStateFrom(info.State ?? {});
|
|
757
|
+
}
|
|
758
|
+
/**
|
|
759
|
+
* The defensive OR shared by `getContainerState` and
|
|
760
|
+
* `getContainerStateDetail`, so a caller asking for detail can never
|
|
761
|
+
* be told something different about running than a caller asking for
|
|
762
|
+
* the coarse state alone.
|
|
763
|
+
*
|
|
764
|
+
* Running if ANY source says so. We'd rather report "running" when the
|
|
765
|
+
* container is actually stopped (worst case: ensureRunning's "already
|
|
766
|
+
* running" fast path skips a start call, which would then fail the
|
|
767
|
+
* subsequent health check and recover) than report "stopped" when it's
|
|
768
|
+
* running (worst case: update service skips legit checks, user sees
|
|
769
|
+
* flap).
|
|
770
|
+
*/
|
|
771
|
+
function coarseStateFrom(state) {
|
|
772
|
+
const status = String(state.Status ?? "")
|
|
773
|
+
.toLowerCase()
|
|
774
|
+
.trim();
|
|
730
775
|
const runningFlag = state.Running === true;
|
|
731
776
|
const pid = Number(state.Pid ?? 0);
|
|
732
777
|
const hasLivePid = Number.isFinite(pid) && pid > 0;
|
|
733
|
-
// Running if ANY source says so. This is the defensive OR — we'd
|
|
734
|
-
// rather report "running" when the container is actually stopped
|
|
735
|
-
// (worst case: ensureRunning's "already running" fast path skips
|
|
736
|
-
// a start call, which would then fail the subsequent health check
|
|
737
|
-
// and recover) than report "stopped" when it's running (worst
|
|
738
|
-
// case: update service skips legit checks, user sees flap).
|
|
739
778
|
if (status === "running" || runningFlag || hasLivePid)
|
|
740
779
|
return "running";
|
|
741
780
|
return "stopped";
|
|
742
781
|
}
|
|
782
|
+
/**
|
|
783
|
+
* Coarse state plus the detail that explains it — exit code, OOM kill,
|
|
784
|
+
* restart count and the container's own healthcheck verdict.
|
|
785
|
+
*
|
|
786
|
+
* `getContainerState` answers "can I talk to it"; this answers "why is
|
|
787
|
+
* it like that". Both read the same `State` block from one inspect, and
|
|
788
|
+
* share `coarseStateFrom` so the two can never disagree about running.
|
|
789
|
+
*
|
|
790
|
+
* Returns `state: "missing"` with no detail when the container is gone.
|
|
791
|
+
* Individual fields stay undefined when the runtime omits them rather
|
|
792
|
+
* than defaulting to a zero that would read as real data.
|
|
793
|
+
*/
|
|
794
|
+
export async function getContainerStateDetail(name, client = getClient()) {
|
|
795
|
+
const info = await safeInspect(() => client.getContainer(prefixedName(name)).inspect());
|
|
796
|
+
if (info === null)
|
|
797
|
+
return { state: "missing" };
|
|
798
|
+
const state = (info.State ?? {});
|
|
799
|
+
// RestartCount is a TOP-LEVEL inspect field on both runtimes, not part
|
|
800
|
+
// of the State block — verified against podman 5.4.2 (its native
|
|
801
|
+
// inspect has no State.RestartCount at all) and Docker.
|
|
802
|
+
const restartCount = info.RestartCount;
|
|
803
|
+
const detail = { state: coarseStateFrom(state) };
|
|
804
|
+
// `typeof === "number"`, never `Number(...)`: dockerode types ExitCode
|
|
805
|
+
// as `number | null`, and `Number(null)` is a finite 0 — which would
|
|
806
|
+
// report a clean exit that never happened. Same for "" and [].
|
|
807
|
+
if (typeof state.ExitCode === "number" && Number.isFinite(state.ExitCode)) {
|
|
808
|
+
detail.exitCode = state.ExitCode;
|
|
809
|
+
}
|
|
810
|
+
if (typeof state.OOMKilled === "boolean")
|
|
811
|
+
detail.oomKilled = state.OOMKilled;
|
|
812
|
+
if (typeof restartCount === "number" &&
|
|
813
|
+
Number.isFinite(restartCount) &&
|
|
814
|
+
restartCount >= 0) {
|
|
815
|
+
detail.restartCount = restartCount;
|
|
816
|
+
}
|
|
817
|
+
const health = String(state.Health?.Status ?? "")
|
|
818
|
+
.toLowerCase()
|
|
819
|
+
.trim();
|
|
820
|
+
if (health === "starting" ||
|
|
821
|
+
health === "healthy" ||
|
|
822
|
+
health === "unhealthy" ||
|
|
823
|
+
health === "none") {
|
|
824
|
+
detail.health = health;
|
|
825
|
+
}
|
|
826
|
+
return detail;
|
|
827
|
+
}
|
|
743
828
|
/**
|
|
744
829
|
* Upper bound on the `.State.Error` text surfaced to callers. Some OCI
|
|
745
830
|
* runtime rejections embed multi-kilobyte detail (spec dumps, nested
|
|
@@ -870,6 +955,61 @@ export async function getRequestedResources(name, client = getClient()) {
|
|
|
870
955
|
return undefined;
|
|
871
956
|
return parseResourceLimits(raw);
|
|
872
957
|
}
|
|
958
|
+
/**
|
|
959
|
+
* Parse the requested-config provenance label written at create time.
|
|
960
|
+
*
|
|
961
|
+
* Returns `undefined` — meaning "no provenance", so the caller keeps
|
|
962
|
+
* today's positive-only drift behaviour — when the label is absent,
|
|
963
|
+
* unparseable, or not an object. It must never return `{}` for a
|
|
964
|
+
* missing label: an empty provenance reads as "the container was
|
|
965
|
+
* created with no env at all", which would mask a genuine unset.
|
|
966
|
+
*
|
|
967
|
+
* Never throws. A hand-edited or truncated label degrades to
|
|
968
|
+
* `undefined` rather than breaking `ensureRunning`.
|
|
969
|
+
*/
|
|
970
|
+
export function parseRequestedConfigLabel(raw) {
|
|
971
|
+
if (typeof raw !== "string")
|
|
972
|
+
return undefined;
|
|
973
|
+
let parsed;
|
|
974
|
+
try {
|
|
975
|
+
parsed = JSON.parse(raw);
|
|
976
|
+
}
|
|
977
|
+
catch {
|
|
978
|
+
return undefined;
|
|
979
|
+
}
|
|
980
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
981
|
+
return undefined;
|
|
982
|
+
}
|
|
983
|
+
const src = parsed;
|
|
984
|
+
const out = {};
|
|
985
|
+
if (isStringArray(src.envKeys))
|
|
986
|
+
out.envKeys = src.envKeys;
|
|
987
|
+
if (isStringArray(src.command))
|
|
988
|
+
out.command = src.command;
|
|
989
|
+
if (isStringArray(src.devices))
|
|
990
|
+
out.devices = src.devices;
|
|
991
|
+
return out;
|
|
992
|
+
}
|
|
993
|
+
function isStringArray(value) {
|
|
994
|
+
return Array.isArray(value) && value.every((v) => typeof v === "string");
|
|
995
|
+
}
|
|
996
|
+
/**
|
|
997
|
+
* Re-shape label provenance into the `ContainerConfig` slice that
|
|
998
|
+
* `diffContainerConfig`'s unset checks read. Env values are not
|
|
999
|
+
* retained in the label, so each key maps to `""` — the unset check
|
|
1000
|
+
* only asks whether a key is present, never what it held.
|
|
1001
|
+
*/
|
|
1002
|
+
function labelProvenanceAsPrior(provenance) {
|
|
1003
|
+
if (!provenance)
|
|
1004
|
+
return undefined;
|
|
1005
|
+
return {
|
|
1006
|
+
env: provenance.envKeys
|
|
1007
|
+
? Object.fromEntries(provenance.envKeys.map((k) => [k, ""]))
|
|
1008
|
+
: undefined,
|
|
1009
|
+
command: provenance.command,
|
|
1010
|
+
devices: provenance.devices,
|
|
1011
|
+
};
|
|
1012
|
+
}
|
|
873
1013
|
/**
|
|
874
1014
|
* Convert a byte count back into the human form consumer plugins
|
|
875
1015
|
* use ("512m", "2g"). Picks the largest unit that produces an
|
|
@@ -1266,18 +1406,20 @@ function sortedStringArraysEqual(a, b) {
|
|
|
1266
1406
|
* for floating tags (`:latest` digest drift) is the update service's job.
|
|
1267
1407
|
* - command: explicit drift when `requested.command` is set and differs
|
|
1268
1408
|
* from `live.command`. When `requested.command` is undefined, drift is
|
|
1269
|
-
* reported only if a `
|
|
1270
|
-
* unsetting it).
|
|
1271
|
-
*
|
|
1272
|
-
*
|
|
1273
|
-
*
|
|
1409
|
+
* reported only if a prior `command` was set (i.e. the user is now
|
|
1410
|
+
* unsetting it). The prior comes from the wrapper's `lastConfigs`
|
|
1411
|
+
* cache when warm, and otherwise from the create-time provenance
|
|
1412
|
+
* label; with neither, an undefined `requested.command` can't be
|
|
1413
|
+
* told apart from "image's baked CMD" so we skip.
|
|
1274
1414
|
* - networkMode: runtime defaults (`bridge`, `slirp4netns`, etc.) are
|
|
1275
1415
|
* normalized to `""` and compared as equivalent to requested undefined.
|
|
1276
1416
|
* - env: requested keys must match live values. Additionally, any key
|
|
1277
|
-
* present in
|
|
1278
|
-
* as drift (the user is unsetting it). Image-baked env keys
|
|
1279
|
-
*
|
|
1280
|
-
*
|
|
1417
|
+
* present in the prior env but absent from `requested.env` is treated
|
|
1418
|
+
* as drift (the user is unsetting it). Image-baked env keys in neither
|
|
1419
|
+
* `requested.env` nor the prior are ignored — they were never ours.
|
|
1420
|
+
* The prior is the warm `lastConfigs` entry, falling back to the env
|
|
1421
|
+
* KEY NAMES recorded in the create-time provenance label; values are
|
|
1422
|
+
* never recorded there because this check reads only key presence.
|
|
1281
1423
|
* - volumes: trailing slashes stripped on both sides; `(host, container)`
|
|
1282
1424
|
* tuples compared as a Map keyed by container path. Live binds have
|
|
1283
1425
|
* their `:Z`/`:ro` flags already stripped by `getLiveContainerConfig`.
|
|
@@ -1301,6 +1443,12 @@ function sortedStringArraysEqual(a, b) {
|
|
|
1301
1443
|
*/
|
|
1302
1444
|
export function diffContainerConfig(requested, live, runtime, prior) {
|
|
1303
1445
|
const drifted = [];
|
|
1446
|
+
// Provenance ladder for the unset checks below: the warm in-memory
|
|
1447
|
+
// prior wins, and the create-time label fills the cold slot after a
|
|
1448
|
+
// Signal K restart. Without the label, a key the consumer dropped
|
|
1449
|
+
// while the server was down would never be detected as drift.
|
|
1450
|
+
const unsetPrior = prior ??
|
|
1451
|
+
labelProvenanceAsPrior(parseRequestedConfigLabel(live.labels[requestedConfigLabel()]));
|
|
1304
1452
|
const requestedImageRef = qualifyImage(requested.digest
|
|
1305
1453
|
? `${requested.image}@${requested.digest}`
|
|
1306
1454
|
: `${requested.image}:${requested.tag}`, runtime);
|
|
@@ -1313,7 +1461,7 @@ export function diffContainerConfig(requested, live, runtime, prior) {
|
|
|
1313
1461
|
drifted.push("command");
|
|
1314
1462
|
}
|
|
1315
1463
|
}
|
|
1316
|
-
else if (
|
|
1464
|
+
else if (unsetPrior?.command !== undefined) {
|
|
1317
1465
|
// Unset detection: the user previously set command and now wants the
|
|
1318
1466
|
// image default back. Recreate so the runtime drops the override.
|
|
1319
1467
|
drifted.push("command");
|
|
@@ -1334,8 +1482,8 @@ export function diffContainerConfig(requested, live, runtime, prior) {
|
|
|
1334
1482
|
// Unset detection: any key we previously set that the user is now
|
|
1335
1483
|
// dropping should force a recreate so the runtime forgets the override.
|
|
1336
1484
|
// Image-baked keys (in live.env but never in prior.env) stay ignored.
|
|
1337
|
-
if (!envDrift &&
|
|
1338
|
-
for (const key of Object.keys(
|
|
1485
|
+
if (!envDrift && unsetPrior?.env) {
|
|
1486
|
+
for (const key of Object.keys(unsetPrior.env)) {
|
|
1339
1487
|
if (!requested.env || !(key in requested.env)) {
|
|
1340
1488
|
envDrift = true;
|
|
1341
1489
|
break;
|
|
@@ -1477,8 +1625,8 @@ export function diffContainerConfig(requested, live, runtime, prior) {
|
|
|
1477
1625
|
!sortedStringArraysEqual(canonicalDeviceKeys(requestedDevices.nodes), canonicalDeviceKeys(presentLiveDeviceNodes(live.devices))) ||
|
|
1478
1626
|
!sortedStringArraysEqual(requestedDevices.cgroupRules, live.deviceCgroupRules);
|
|
1479
1627
|
}
|
|
1480
|
-
else if (
|
|
1481
|
-
const priorDevices = resolveDeviceRequests(filterUnresolvedDeviceEntries(
|
|
1628
|
+
else if (unsetPrior !== undefined) {
|
|
1629
|
+
const priorDevices = resolveDeviceRequests(filterUnresolvedDeviceEntries(unsetPrior.devices ?? [], unresolvedDevices), runtime);
|
|
1482
1630
|
devicesDrift =
|
|
1483
1631
|
!sortedStringArraysEqual(canonicalDeviceKeys(requestedDevices.nodes), canonicalDeviceKeys(priorDevices.nodes)) ||
|
|
1484
1632
|
!sortedStringArraysEqual(requestedDevices.cgroupRules, priorDevices.cgroupRules);
|
|
@@ -1983,9 +2131,19 @@ function buildCreateOptions(name, config, runtime, healthcheck, debug = () => {
|
|
|
1983
2131
|
// runtime-injected limit (rootless podman clamps a child's
|
|
1984
2132
|
// oom_score_adj up to its parent's) is never misread as a user
|
|
1985
2133
|
// unset. Stamped after the consumer labels so it can't be shadowed.
|
|
2134
|
+
//
|
|
2135
|
+
// The requested-config provenance label does the same job for the
|
|
2136
|
+
// fields whose *unset* can only be detected against a prior config:
|
|
2137
|
+
// env keys, `command` and `devices`. Env records key names only —
|
|
2138
|
+
// the unset check never reads a value, and a value can be a secret.
|
|
1986
2139
|
options.Labels = {
|
|
1987
2140
|
...config.labels,
|
|
1988
2141
|
[requestedResourcesLabel()]: JSON.stringify(config.resources ?? {}),
|
|
2142
|
+
[requestedConfigLabel()]: JSON.stringify({
|
|
2143
|
+
...(config.env ? { envKeys: Object.keys(config.env).sort() } : {}),
|
|
2144
|
+
...(config.command ? { command: [...config.command] } : {}),
|
|
2145
|
+
...(config.devices ? { devices: [...config.devices] } : {}),
|
|
2146
|
+
}),
|
|
1989
2147
|
};
|
|
1990
2148
|
// Healthcheck. An explicit override wins over the image's own
|
|
1991
2149
|
// HEALTHCHECK; we always emit it ourselves rather than relying on
|
|
@@ -2003,8 +2161,10 @@ export async function ensureRunning(runtime, name, config, debug, options, clien
|
|
|
2003
2161
|
* this signalk-container lifetime, if any. Used to detect "unset" drift
|
|
2004
2162
|
* — env keys removed, `command` previously set and now undefined. The
|
|
2005
2163
|
* wrapper in `index.ts` reads from its `lastConfigs` cache before
|
|
2006
|
-
* overwriting it
|
|
2007
|
-
*
|
|
2164
|
+
* overwriting it. On the first call (or after a Signal K restart) it
|
|
2165
|
+
* is undefined and the diff falls back to the requested-config
|
|
2166
|
+
* provenance label stamped at create time, so an unset is still
|
|
2167
|
+
* detected across a restart.
|
|
2008
2168
|
*/
|
|
2009
2169
|
prior, _postRecreate = false, _pull = pullImage) {
|
|
2010
2170
|
const fullName = prefixedName(name);
|
|
@@ -3561,6 +3721,73 @@ export async function resolveHostPath(absPath, runtime, debug = () => { }, clien
|
|
|
3561
3721
|
}
|
|
3562
3722
|
return resolved;
|
|
3563
3723
|
}
|
|
3724
|
+
/**
|
|
3725
|
+
* Can `existsSync(hostPath)` be trusted inside this container?
|
|
3726
|
+
*
|
|
3727
|
+
* The caller holds a HOST path and stats that same string locally, so the
|
|
3728
|
+
* mount has to make those two the same thing. Three conditions, and all are
|
|
3729
|
+
* load-bearing:
|
|
3730
|
+
*
|
|
3731
|
+
* - **Bind mounts only.** A named volume's contents are not the host
|
|
3732
|
+
* filesystem at that path, so a file seen inside one proves nothing.
|
|
3733
|
+
* - **Path-preserving only** (`source === dest`). A bind of `/host/data` to
|
|
3734
|
+
* `/data` puts the host's `/host/data` at `/data`; the string `/data` inside
|
|
3735
|
+
* the container names `/host/data` on the host, and the host's own `/data`
|
|
3736
|
+
* is not visible at all. Verified against a real runtime. Trusting such a
|
|
3737
|
+
* mount would let `existsSync("/data/certs")` answer about
|
|
3738
|
+
* `/host/data/certs` and report a nonexistent required source as present --
|
|
3739
|
+
* exactly the `ifMissing: "abort"` failure this guards.
|
|
3740
|
+
* - **Exact-or-child.** A mount at `/data` covers `/data` and `/data/sub`,
|
|
3741
|
+
* never `/database`.
|
|
3742
|
+
*
|
|
3743
|
+
* Factored out of `ownBindMountCoverage` so the rule is testable without a
|
|
3744
|
+
* runtime.
|
|
3745
|
+
*/
|
|
3746
|
+
export function isPathUnderBindMount(absPath, mounts) {
|
|
3747
|
+
return mounts.some((m) => m.type === "bind" &&
|
|
3748
|
+
m.source === m.dest &&
|
|
3749
|
+
(absPath === m.dest || absPath.startsWith(m.dest + "/")));
|
|
3750
|
+
}
|
|
3751
|
+
/**
|
|
3752
|
+
* Host paths this container can see truthfully, as a predicate.
|
|
3753
|
+
*
|
|
3754
|
+
* A bind mount makes this container's view of a path the HOST's view at a
|
|
3755
|
+
* known offset, so `existsSync` under one is authoritative in both directions.
|
|
3756
|
+
* Anywhere else a containerized process is looking at a different filesystem
|
|
3757
|
+
* entirely, and neither answer means anything about the host.
|
|
3758
|
+
*
|
|
3759
|
+
* Returns a predicate rather than resolving one path so the inspect happens
|
|
3760
|
+
* ONCE per reconcile instead of once per volume. On bare metal, or when the
|
|
3761
|
+
* self-inspect fails, every path is covered / not covered respectively — the
|
|
3762
|
+
* caller decides what that means.
|
|
3763
|
+
*/
|
|
3764
|
+
export async function ownBindMountCoverage(runtime, debug = () => { }, client = getClient()) {
|
|
3765
|
+
if (!isContainerized())
|
|
3766
|
+
return () => true;
|
|
3767
|
+
// Every failure below degrades to "covers nothing", never to a throw.
|
|
3768
|
+
// safeInspect rethrows anything that is not a 404, and findSelfContainerId
|
|
3769
|
+
// touches the runtime too; letting either escape would reject ensureRunning
|
|
3770
|
+
// outright on a transient daemon hiccup, when the tri-state classification
|
|
3771
|
+
// is designed to carry on with "unknown" instead.
|
|
3772
|
+
try {
|
|
3773
|
+
const selfId = await findSelfContainerId(runtime, debug, client);
|
|
3774
|
+
if (!selfId) {
|
|
3775
|
+
debug("ownBindMountCoverage: could not detect self container id");
|
|
3776
|
+
return () => false;
|
|
3777
|
+
}
|
|
3778
|
+
const info = await safeInspect(() => client.getContainer(selfId).inspect());
|
|
3779
|
+
if (info === null) {
|
|
3780
|
+
debug(`ownBindMountCoverage: inspect ${selfId} failed`);
|
|
3781
|
+
return () => false;
|
|
3782
|
+
}
|
|
3783
|
+
const mounts = mountsFromInspect(info);
|
|
3784
|
+
return (absPath) => isPathUnderBindMount(absPath, mounts);
|
|
3785
|
+
}
|
|
3786
|
+
catch (err) {
|
|
3787
|
+
debug(`ownBindMountCoverage: could not read own mounts (${err instanceof Error ? err.message : String(err)}); treating every path as unverifiable`);
|
|
3788
|
+
return () => false;
|
|
3789
|
+
}
|
|
3790
|
+
}
|
|
3564
3791
|
/**
|
|
3565
3792
|
* Process-local set of ports that are currently reserved by an in-flight
|
|
3566
3793
|
* `findAvailablePort()` call. Prevents two concurrent `ensureRunning()`
|