Salut à tous,
J’ai récemment rencontré ce problème et j’ai réussi à le résoudre. Je voulais partager mes découvertes ici au cas où ce ne serait pas un comportement intentionnel, ou au cas où cela aiderait quelqu’un d’autre.
Le problème
Après la dernière version « bêta » [2.29.5] des task runners, j’ai commencé à recevoir cette erreur en essayant de construire une image de runner personnalisée :
#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
Les symptômes
- L’erreur de store : En exécutant une simple commande
pnpm adddans mon Dockerfile personnalisé, j’ai reçu[ERR_PNPM_UNEXPECTED_STORE]. Lesnode_modulesde l’image de base étaient liés à un storev10, mais mon étape de construction essayait d’utiliser un storev11. - L’erreur npx : J’ai essayé de forcer pnpm v10 en utilisant
npx -y pnpm@10 add ..., mais l’image de base est construite surpython:alpineet ne copie que le binairenodeetcorepack. Elle ne contient ninpmninpx, ce qui a donné/bin/sh: npx: not found.
La cause racine
En regardant le code source de n8n, ils ont récemment mis à jour les Dockerfiles des runners pour épingler explicitement PNPM_VERSION=10.32.1 lors de leur processus de construction (Commit 25d0d12).
Ils ont fait cela parce que pnpm deploy supprime le champ packageManager, de sorte qu’un simple corepack enable pnpm se résout en pnpm 11.x. pnpm 11 définit par défaut minimumReleaseAge à 24 heures, ce qui rejette les dépendances publiées moins d’un jour auparavant.
Cependant, si vous exécutez simplement un pnpm add simple dans votre Dockerfile personnalisé, corepack ignore cette version épinglée et télécharge automatiquement la version la plus récente (v11). pnpm 11 utilise un format de store différent et refuse d’interagir avec le store v10 laissé par l’image de base.
La solution
Pour résoudre cela, vous devez utiliser corepack pour activer explicitement pnpm v10 avant d’exécuter votre commande pnpm add.
Au lieu de faire ceci :
RUN cd /opt/runners/task-runner-javascript && \
pnpm add moment uuid
Modifiez l’étape de votre Dockerfile comme ceci :
# 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
J’espère que cela gagnera à quelqu’un d’autre quelques heures de débogage ! J’apprécierais aussi que quelqu’un puisse confirmer si l’épinglage à v10 est le comportement attendu à l’avenir.