Skip to content

Commit 0919890

Browse files
stubbiclaude
andcommitted
fix: copy full /app in Dockerfile — pnpm symlinks break selective copy (#13)
pnpm workspaces use symlinks in each package's node_modules to resolve dependencies. Selective dist-only COPY misses these symlinks, causing ERR_MODULE_NOT_FOUND for drizzle-orm and other deps at runtime. Copy the full /app directory instead. .dockerignore controls what enters the build context. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 0791c5c commit 0919890

1 file changed

Lines changed: 4 additions & 41 deletions

File tree

Dockerfile

Lines changed: 4 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -80,47 +80,10 @@ RUN mkdir -p /paperclip && chown node:node /paperclip
8080

8181
WORKDIR /app
8282

83-
# Copy only production node_modules (rebuilt as prod-only in build stage)
84-
COPY --chown=node:node --from=build /app/node_modules ./node_modules
85-
COPY --chown=node:node --from=build /app/package.json /app/pnpm-workspace.yaml /app/.npmrc ./
86-
87-
# Server: only compiled output + runtime deps
88-
COPY --chown=node:node --from=build /app/server/dist ./server/dist
89-
COPY --chown=node:node --from=build /app/server/package.json ./server/
90-
COPY --chown=node:node --from=build /app/server/node_modules ./server/node_modules
91-
92-
# UI: only built static files
93-
COPY --chown=node:node --from=build /app/ui/dist ./ui/dist
94-
95-
# Shared packages: only dist output
96-
COPY --chown=node:node --from=build /app/packages/shared/dist ./packages/shared/dist
97-
COPY --chown=node:node --from=build /app/packages/shared/package.json ./packages/shared/
98-
COPY --chown=node:node --from=build /app/packages/db/dist ./packages/db/dist
99-
COPY --chown=node:node --from=build /app/packages/db/package.json ./packages/db/
100-
COPY --chown=node:node --from=build /app/packages/adapter-utils/dist ./packages/adapter-utils/dist
101-
COPY --chown=node:node --from=build /app/packages/adapter-utils/package.json ./packages/adapter-utils/
102-
COPY --chown=node:node --from=build /app/packages/plugins/sdk/dist ./packages/plugins/sdk/dist
103-
COPY --chown=node:node --from=build /app/packages/plugins/sdk/package.json ./packages/plugins/sdk/
104-
105-
# Adapters: only dist output
106-
COPY --chown=node:node --from=build /app/packages/adapters/claude-local/dist ./packages/adapters/claude-local/dist
107-
COPY --chown=node:node --from=build /app/packages/adapters/claude-local/package.json ./packages/adapters/claude-local/
108-
COPY --chown=node:node --from=build /app/packages/adapters/codex-local/dist ./packages/adapters/codex-local/dist
109-
COPY --chown=node:node --from=build /app/packages/adapters/codex-local/package.json ./packages/adapters/codex-local/
110-
COPY --chown=node:node --from=build /app/packages/adapters/cursor-local/dist ./packages/adapters/cursor-local/dist
111-
COPY --chown=node:node --from=build /app/packages/adapters/cursor-local/package.json ./packages/adapters/cursor-local/
112-
COPY --chown=node:node --from=build /app/packages/adapters/gemini-local/dist ./packages/adapters/gemini-local/dist
113-
COPY --chown=node:node --from=build /app/packages/adapters/gemini-local/package.json ./packages/adapters/gemini-local/
114-
COPY --chown=node:node --from=build /app/packages/adapters/openclaw-gateway/dist ./packages/adapters/openclaw-gateway/dist
115-
COPY --chown=node:node --from=build /app/packages/adapters/openclaw-gateway/package.json ./packages/adapters/openclaw-gateway/
116-
COPY --chown=node:node --from=build /app/packages/adapters/opencode-local/dist ./packages/adapters/opencode-local/dist
117-
COPY --chown=node:node --from=build /app/packages/adapters/opencode-local/package.json ./packages/adapters/opencode-local/
118-
COPY --chown=node:node --from=build /app/packages/adapters/pi-local/dist ./packages/adapters/pi-local/dist
119-
COPY --chown=node:node --from=build /app/packages/adapters/pi-local/package.json ./packages/adapters/pi-local/
120-
121-
# CLI
122-
COPY --chown=node:node --from=build /app/cli/dist ./cli/dist
123-
COPY --chown=node:node --from=build /app/cli/package.json ./cli/
83+
# Copy full built app — pnpm symlinks node_modules per workspace package,
84+
# so selective dist-only copy breaks dependency resolution. The .dockerignore
85+
# already excludes tests, docs, desktop source, and dev files from context.
86+
COPY --chown=node:node --from=build /app /app
12487

12588
ENV NODE_ENV=production \
12689
HOME=/paperclip \

0 commit comments

Comments
 (0)