[ERR_PNPM_UNEXPECTED_STORE] 將 npm 套件新增至 Task Runners 時發生意外的儲存位置

嗨各位,

我最近遇到了這個問題,並成功解決了。我想在這裡分享我的發現,以防這不是預期的行為,或者希望能幫助其他人。

問題所在

在更新到最新的「測試版」[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

問題症狀

  1. 存儲區錯誤: 在我的自訂 Dockerfile 中執行標準 pnpm add 命令時,我得到了 [ERR_PNPM_UNEXPECTED_STORE] 錯誤。基礎映像的 node_modules 連結到 v10 存儲區,但我的構建步驟嘗試使用 v11 存儲區。
  2. npx 錯誤: 我嘗試使用 npx -y pnpm@10 add ... 強制使用 pnpm v10,但基礎映像基於 python:alpine,只複製了 node 二進位和 corepack。它不包括 npmnpx,導致出現 /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 addcorepack 會忽略這個固定版本,並自動下載最新版本(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 是否是預期的未來行為。

很棒的分享,@mohamed3nan !!

感謝你提供的資訊,我已經建立了 CAT-3666 這張內部開發票證來修復這個問題。

感謝 @mohamed3nan 找到那個修復方案。省了我很多調查工作!不過如果他們改變版本的話,這個方案有點脆弱,所以我更新了它來明確讀取目前的版本,像這樣:

RUN PNPM_VER=$(sed -n 's/.*"packageManager": "pnpm@\([^"]*\)".*/\1/p' /opt/runners/task-runner-javascript/node_modules/.modules.yaml) && \
    corepack prepare pnpm@${PNPM_VER} --activate && \
    cd /opt/runners/task-runner-javascript && \
    pnpm add \
        <list-of-packages>

希望在版本改變之前會有適當的修復,不過謹慎總是好的。