




















@@ -327,15 +327,24 @@ describe("Dockerfile", () => {
327327it("pre-creates named-volume mount points before switching to the node user", async () => {
328328const dockerfile = await readFile(dockerfilePath, "utf8");
329329const runtimeStageIndex = dockerfile.lastIndexOf("FROM base-runtime");
330-const stateDirIndex = dockerfile.indexOf(
331-"RUN install -d -m 0700 -o node -g node \\",
330+const parentConfigDirIndex = dockerfile.indexOf(
331+"RUN install -d -m 0755 -o node -g node /home/node/.config",
332332runtimeStageIndex,
333333);
334+const stateDirIndex = dockerfile.indexOf(
335+"install -d -m 0700 -o node -g node \\",
336+parentConfigDirIndex,
337+);
334338const userIndex = dockerfile.indexOf("USER node", runtimeStageIndex);
335339336340expect(runtimeStageIndex).toBeGreaterThan(-1);
341+// Regression: /home/node/.config parent must be created with node ownership
342+// before the leaf .config/openclaw dir (issue #85968).
343+expect(parentConfigDirIndex).toBeGreaterThan(-1);
337344expect(stateDirIndex).toBeGreaterThan(-1);
338345expect(userIndex).toBeGreaterThan(-1);
346+expect(parentConfigDirIndex).toBeGreaterThan(runtimeStageIndex);
347+expect(parentConfigDirIndex).toBeLessThan(stateDirIndex);
339348expect(stateDirIndex).toBeGreaterThan(runtimeStageIndex);
340349expect(stateDirIndex).toBeLessThan(userIndex);
341350expect(dockerfile).not.toContain("mkdir -p /home/node/.openclaw");
@@ -347,6 +356,10 @@ describe("Dockerfile", () => {
347356expect(dockerfile).toContain(
348357"stat -c '%U:%G %a' /home/node/.openclaw/workspace | grep -qx 'node:node 700'",
349358);
359+// Regression: assert parent /home/node/.config is also node-owned (issue #85968).
360+expect(dockerfile).toContain(
361+"stat -c '%U:%G %a' /home/node/.config | grep -qx 'node:node 755'",
362+);
350363expect(dockerfile).toContain(
351364"stat -c '%U:%G %a' /home/node/.config/openclaw | grep -qx 'node:node 700'",
352365);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。