嗨各位,
我最近遇到了這個問題,並成功解決了。我想在這裡分享我的發現,以防這不是預期的行為,或者希望能幫助其他人。
問題所在
在更新到最新的「測試版」[2.29.5] 任務執行器版本後,我在嘗試構建自訂執行器映像時開始收到此錯誤:
#13 [stage-1 7/8] RUN cd /opt/runners/task-runner-javascript && pnpm add moment uuid
#13 0.829 ! Corepack is about to download https://registry.npmjs.org/pnpm/-/pnpm-11.10.0.tgz
#13 2.407 [ERR_PNPM_UNEXPECTED_STORE] Unexpected store location
#13 2.407
#13 2.407 The dependencies at "/opt/runners/task-runner-javascript/node_modules" are currently linked from the store at "/root/.local/share/pnpm/store/v10".
#13 2.407
#13 2.407 pnpm now wants to use the store at "/root/.local/share/pnpm/store/v11" to link dependencies.
#13 2.407
#13 2.407 If you want to use the new store location, reinstall your dependencies with "pnpm install".
#13 2.407
#13 2.407 You may change the global store location by running "pnpm config set store-dir <dir> --global".
#13 2.407 (This error may happen if the node_modules was installed with a different major version of pnpm)
#13 ERROR: process "/bin/sh -c cd /opt/runners/task-runner-javascript && pnpm add moment uuid" did not complete successfully: exit code: 1
問題症狀
- 存儲區錯誤: 在我的自訂 Dockerfile 中執行標準
pnpm add命令時,我得到了[ERR_PNPM_UNEXPECTED_STORE]錯誤。基礎映像的node_modules連結到v10存儲區,但我的構建步驟嘗試使用v11存儲區。 - npx 錯誤: 我嘗試使用
npx -y pnpm@10 add ...強制使用 pnpm v10,但基礎映像基於python:alpine,只複製了node二進位和corepack。它不包括npm或npx,導致出現/bin/sh: npx: not found錯誤。
根本原因
查看 n8n 的源代碼,他們最近更新了執行器 Dockerfile,在構建過程中明確固定了 PNPM_VERSION=10.32.1(提交 25d0d12)。
他們這樣做是因為 pnpm deploy 會刪除 packageManager 字段,所以一個簡單的 corepack enable pnpm 會解析為 pnpm 11.x。pnpm 11 將 minimumReleaseAge 預設設置為 24 小時,這會拒絕在不到一天前發佈的依賴項。
但是,如果你只是在自訂 Dockerfile 中執行簡單的 pnpm add,corepack 會忽略這個固定版本,並自動下載最新版本(v11)。pnpm 11 使用不同的存儲區格式,並拒絕與基礎映像遺留下來的 v10 存儲區進行互動。
解決方案
要修復此問題,你必須使用 corepack 在執行 pnpm add 命令之前明確啟用 pnpm v10。
不要這樣做:
RUN cd /opt/runners/task-runner-javascript && \
pnpm add moment uuid
改為將你的 Dockerfile 步驟改為:
# Activate pnpm 10.32.1 to match the base image's v10 store (npx is not available in this image)
RUN corepack prepare pnpm@10.32.1 --activate && \
cd /opt/runners/task-runner-javascript && \
pnpm add \
moment \
uuid
希望這能為其他人省去幾個小時的除錯時間!我也很想知道是否有人能確認固定為 v10 是否是預期的未來行為。