fix(docker): run runtime image under tini (#78777) · openclaw/openclaw@e63e4f9
VintageAyu
·
2026-05-08
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -6,6 +6,7 @@ Docs: https://docs.openclaw.ai
|
6 | 6 | |
7 | 7 | ### Changes |
8 | 8 | |
| 9 | +- Docker: run the runtime image under `tini` so long-lived containers reap orphaned child processes and forward signals correctly. (#77885) Thanks @VintageAyu. |
9 | 10 | - Google/Gemini: normalize retired `google/gemini-3-pro-preview` and `google-gemini-cli/gemini-3-pro-preview` selections to `google/gemini-3.1-pro-preview` before they are written to model config. |
10 | 11 | - Amazon Bedrock: support `serviceTier` parameter for Bedrock models, configurable via `agents.defaults.params.serviceTier` or per-model in `agents.defaults.models`. Valid values: `default`, `flex`, `priority`, `reserved`. (#64512) Thanks @mobilinkd. |
11 | 12 | - Control UI: read the Quick Settings exec policy badge from `tools.exec.security` instead of the non-schema `agents.defaults.exec.security` path, so configured `full`/`deny` values render accurately. Fixes #78311. Thanks @FriedBack. |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -160,7 +160,7 @@ RUN --mount=type=cache,id=openclaw-bookworm-apt-cache,target=/var/cache/apt,shar
|
160 | 160 | --mount=type=cache,id=openclaw-bookworm-apt-lists,target=/var/lib/apt,sharing=locked \ |
161 | 161 | apt-get update && \ |
162 | 162 | DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ |
163 | | - ca-certificates procps hostname curl git lsof openssl python3 && \ |
| 163 | + ca-certificates procps hostname curl git lsof openssl python3 tini && \ |
164 | 164 | update-ca-certificates |
165 | 165 | |
166 | 166 | RUN chown node:node /app |
@@ -287,4 +287,5 @@ USER node
|
287 | 287 | # For external access from host/ingress, override bind to "lan" and set auth. |
288 | 288 | HEALTHCHECK --interval=3m --timeout=10s --start-period=15s --retries=3 \ |
289 | 289 | CMD node -e "fetch('http://127.0.0.1:18789/healthz').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" |
| 290 | +ENTRYPOINT ["tini", "-s", "--"] |
290 | 291 | CMD ["node", "openclaw.mjs", "gateway", "--allow-unconfigured"] |
| Original file line number | Diff line number | Diff line change |
|---|
@@ -427,8 +427,7 @@ See [ClawDock](/install/clawdock) for the full helper guide.
|
427 | 427 | </Accordion> |
428 | 428 | |
429 | 429 | <Accordion title="Base image metadata"> |
430 | | -The main Docker runtime image uses `node:24-bookworm-slim` and publishes OCI |
431 | | -base-image annotations including `org.opencontainers.image.base.name`, |
| 430 | +The main Docker runtime image uses `node:24-bookworm-slim` and includes `tini` as the entrypoint init process (PID 1) to ensure zombie processes are reaped and signals are handled correctly in long-running containers. It publishes OCI base-image annotations including `org.opencontainers.image.base.name`, |
432 | 431 | `org.opencontainers.image.source`, and others. The Node base digest is |
433 | 432 | refreshed through Dependabot Docker base-image PRs; release builds do not run |
434 | 433 | a distro upgrade layer. See |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -78,6 +78,8 @@ read_when:
|
78 | 78 | destination = "/data" |
79 | 79 | ``` |
80 | 80 | |
| 81 | +The OpenClaw Docker image uses `tini` as its entrypoint. Fly process commands replace Docker `CMD` without replacing `ENTRYPOINT`, so the process still runs under `tini`. |
| 82 | + |
81 | 83 | **Key settings:** |
82 | 84 | |
83 | 85 | | Setting | Why | |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -47,7 +47,7 @@ describe("Dockerfile", () => {
|
47 | 47 | expect(collapsed).toContain("update-ca-certificates"); |
48 | 48 | }); |
49 | 49 | |
50 | | -it("installs python3 in the slim runtime stage for workspace scripts", async () => { |
| 50 | +it("installs python3 and tini in the slim runtime stage", async () => { |
51 | 51 | const dockerfile = collapseDockerContinuations(await readFile(dockerfilePath, "utf8")); |
52 | 52 | const runtimeIndex = dockerfile.indexOf( |
53 | 53 | "FROM ${OPENCLAW_NODE_BOOKWORM_SLIM_IMAGE} AS base-runtime", |
@@ -59,7 +59,10 @@ describe("Dockerfile", () => {
|
59 | 59 | expect(runtimeIndex).toBeGreaterThan(-1); |
60 | 60 | expect(pythonInstallIndex).toBeGreaterThan(runtimeIndex); |
61 | 61 | expect(pythonInstallIndex).toBeLessThan(dockerfile.indexOf("RUN chown node:node /app")); |
62 | | -expect(dockerfile).toContain("ca-certificates procps hostname curl git lsof openssl python3"); |
| 62 | +expect(dockerfile).toContain( |
| 63 | +"ca-certificates procps hostname curl git lsof openssl python3 tini", |
| 64 | +); |
| 65 | +expect(dockerfile).toContain('ENTRYPOINT ["tini", "-s", "--"]'); |
63 | 66 | }); |
64 | 67 | |
65 | 68 | it("installs optional browser dependencies after pnpm install", async () => { |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。