From 24958862877c96670b9787aba4df436044202116 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 24 Apr 2026 18:42:20 +0100 Subject: [PATCH] perf: shrink Docker dependency build contexts --- Dockerfile | 4 ++-- scripts/e2e/Dockerfile | 10 ++++++++-- src/auto-reply/reply/get-reply-run.media-only.test.ts | 1 + src/docker-build-cache.test.ts | 7 ++++++- test/scripts/ci-node-test-plan.test.ts | 1 + 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 33eac6364d1..70495735842 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,9 +29,9 @@ ARG OPENCLAW_NODE_BOOKWORM_SLIM_DIGEST="sha256:e8e2e91b1378f83c5b2dd15f0247f3411 FROM ${OPENCLAW_NODE_BOOKWORM_IMAGE} AS ext-deps ARG OPENCLAW_EXTENSIONS ARG OPENCLAW_BUNDLED_PLUGIN_DIR -COPY ${OPENCLAW_BUNDLED_PLUGIN_DIR} /tmp/${OPENCLAW_BUNDLED_PLUGIN_DIR} # Copy package.json for opted-in extensions so pnpm resolves their deps. -RUN mkdir -p /out && \ +RUN --mount=type=bind,source=${OPENCLAW_BUNDLED_PLUGIN_DIR},target=/tmp/${OPENCLAW_BUNDLED_PLUGIN_DIR},readonly \ + mkdir -p /out && \ for ext in $OPENCLAW_EXTENSIONS; do \ if [ -f "/tmp/${OPENCLAW_BUNDLED_PLUGIN_DIR}/$ext/package.json" ]; then \ mkdir -p "/out/$ext" && \ diff --git a/scripts/e2e/Dockerfile b/scripts/e2e/Dockerfile index fef5fa10f12..1e25a3f7e5c 100644 --- a/scripts/e2e/Dockerfile +++ b/scripts/e2e/Dockerfile @@ -25,9 +25,15 @@ FROM e2e-runner AS deps COPY --chown=appuser:appuser package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./ COPY --chown=appuser:appuser ui/package.json ./ui/package.json -COPY --chown=appuser:appuser extensions ./extensions COPY --chown=appuser:appuser patches ./patches COPY --chown=appuser:appuser scripts/postinstall-bundled-plugins.mjs scripts/preinstall-package-manager-warning.mjs scripts/npm-runner.mjs scripts/windows-cmd-helpers.mjs ./scripts/ +RUN --mount=type=bind,source=extensions,target=/tmp/extensions,readonly \ + find /tmp/extensions -mindepth 2 -maxdepth 2 -name package.json -print | \ + while IFS= read -r manifest; do \ + dest="${manifest#/tmp/}"; \ + mkdir -p "$(dirname "$dest")"; \ + cp "$manifest" "$dest"; \ + done RUN --mount=type=cache,id=openclaw-pnpm-store,target=/home/appuser/.local/share/pnpm/store,sharing=locked \ pnpm install --frozen-lockfile @@ -42,7 +48,7 @@ COPY --chown=appuser:appuser docs ./docs COPY --chown=appuser:appuser packages ./packages COPY --chown=appuser:appuser skills ./skills COPY --chown=appuser:appuser ui ./ui -COPY --chown=appuser:appuser extensions ./extensions +COPY --link --chown=appuser:appuser extensions ./extensions COPY --chown=appuser:appuser vendor/a2ui/renderers/lit ./vendor/a2ui/renderers/lit COPY --chown=appuser:appuser apps/shared/OpenClawKit/Sources/OpenClawKit/Resources ./apps/shared/OpenClawKit/Sources/OpenClawKit/Resources COPY --chown=appuser:appuser apps/shared/OpenClawKit/Tools/CanvasA2UI ./apps/shared/OpenClawKit/Tools/CanvasA2UI diff --git a/src/auto-reply/reply/get-reply-run.media-only.test.ts b/src/auto-reply/reply/get-reply-run.media-only.test.ts index 358c3e7fa5e..292301a82ac 100644 --- a/src/auto-reply/reply/get-reply-run.media-only.test.ts +++ b/src/auto-reply/reply/get-reply-run.media-only.test.ts @@ -77,6 +77,7 @@ vi.mock("./groups.js", () => ({ buildDirectChatContext: vi.fn().mockReturnValue(""), buildGroupIntro: vi.fn().mockReturnValue(""), buildGroupChatContext: vi.fn().mockReturnValue(""), + buildDirectChatContext: vi.fn().mockReturnValue(""), })); vi.mock("./inbound-meta.js", () => ({ diff --git a/src/docker-build-cache.test.ts b/src/docker-build-cache.test.ts index ea2cc6768fa..3cfc5b01d10 100644 --- a/src/docker-build-cache.test.ts +++ b/src/docker-build-cache.test.ts @@ -108,7 +108,9 @@ describe("docker build cache layout", () => { expectPatternBeforeInstall( /^COPY(?:\s+--chown=\S+)?\s+ui\/package\.json \.\/ui\/package\.json$/m, ); - expectPatternBeforeInstall(/^COPY(?:\s+--chown=\S+)?\s+extensions \.\/extensions$/m); + expectPatternBeforeInstall( + /^RUN --mount=type=bind,source=extensions,target=\/tmp\/extensions,readonly\s+\\$/m, + ); expectPatternBeforeInstall(/^COPY(?:\s+--chown=\S+)?\s+patches \.\/patches$/m); expectPatternBeforeInstall( /^COPY(?:\s+--chown=\S+)?\s+scripts\/postinstall-bundled-plugins\.mjs scripts\/preinstall-package-manager-warning\.mjs scripts\/npm-runner\.mjs scripts\/windows-cmd-helpers\.mjs \.\/scripts\/$/m, @@ -120,6 +122,9 @@ describe("docker build cache layout", () => { expectPatternAfterInstall(/^COPY(?:\s+--chown=\S+)?\s+test \.\/test$/m); expectPatternAfterInstall(/^COPY(?:\s+--chown=\S+)?\s+scripts \.\/scripts$/m); expectPatternAfterInstall(/^COPY(?:\s+--chown=\S+)?\s+ui \.\/ui$/m); + expectPatternAfterInstall( + /^COPY(?:\s+--link)?(?:\s+--chown=\S+)?\s+extensions \.\/extensions$/m, + ); }); it("copies manifests before install in the qr-import image", async () => { diff --git a/test/scripts/ci-node-test-plan.test.ts b/test/scripts/ci-node-test-plan.test.ts index 9bd9a6c1753..6965a18ea10 100644 --- a/test/scripts/ci-node-test-plan.test.ts +++ b/test/scripts/ci-node-test-plan.test.ts @@ -155,6 +155,7 @@ describe("scripts/lib/ci-node-test-plan.mjs", () => { configs: ["test/vitest/vitest.gateway-server.config.ts"], runner: "blacksmith-4vcpu-ubuntu-2404", requiresDist: false, + runner: "blacksmith-4vcpu-ubuntu-2404", }); expect(commandsShard).toEqual({ checkName: "checks-node-agentic-commands",