[ERR_PNPM_UNEXPECTED_STORE] Emplacement de store inattendu lors de l'ajout de packages npm aux Task Runners

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

  1. L’erreur de store : En exécutant une simple commande pnpm add dans mon Dockerfile personnalisé, j’ai reçu [ERR_PNPM_UNEXPECTED_STORE]. Les node_modules de l’image de base étaient liés à un store v10, mais mon étape de construction essayait d’utiliser un store v11.
  2. L’erreur npx : J’ai essayé de forcer pnpm v10 en utilisant npx -y pnpm@10 add ..., mais l’image de base est construite sur python:alpine et ne copie que le binaire node et corepack. Elle ne contient ni npm ni npx, 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.

Super partage, @mohamed3nan !!

Merci pour cela, j’ai créé CAT-3666 comme ticket de développement interne pour corriger le problème.

Merci d’avoir trouvé ce correctif @mohamed3nan. Ça m’a fait gagner beaucoup de temps d’investigation! C’est un peu fragile s’ils changent la version, donc je l’ai mis à jour pour lire explicitement la version actuelle comme ceci :

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>

Espérons qu’il y aura un correctif approprié avant que la version change, mais mieux vaut prévenir que guérir.