[ERR_PNPM_UNEXPECTED_STORE] Unerwarteter Store-Speicherort beim Hinzufügen von npm-Paketen zu Task Runners

Hallo zusammen,

Ich bin vor Kurzem auf dieses Problem gestoßen und habe es gelöst. Ich wollte meine Erkenntnisse hier posten, falls dieses Verhalten nicht beabsichtigt ist oder falls es jemandem anderem hilft.

Das Problem

Nach der neuesten „Beta-Version

Großartig geteilt, @mohamed3nan !!

Vielen Dank dafür, ich habe CAT-3666 als internes Dev-Ticket erstellt, um das zu beheben.

Danke, dass du diesen Fix gefunden hast, @mohamed3nan. Das hat mir viel Recherche erspart! Es ist etwas anfällig, wenn sie die Version ändern. Daher habe ich es aktualisiert, um die aktuelle Version explizit auszulesen, etwa so:

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>

Hoffentlich gibt es eine ordentliche Lösung, bevor sich die Version ändert, aber lieber sicher als sorry.

Update: Das Store-Problem ist behoben, aber ein neues ist an seine Stelle getreten…

Details unten (Writeup zusammen mit meinem KI-Assistent verfasst, alles auf meiner eigenen Instanz verifiziert):

#36424 erhöht PNPM_VERSION in docker/images/runners/Dockerfile von 10.32.1 auf 11.22.0, sodass node_modules des Images und das pnpm, das du bekommst, beide auf v11 laufen — kein v10/v11-Mismatch mehr. Corepack ist auch weg: Node bündelt es nicht mehr und das Runtime-Image hat kein npm, daher wird pnpm jetzt direkt als Paket kopiert:

COPY --from=node-alpine /usr/local/lib/node_modules/pnpm /usr/local/lib/node_modules/pnpm
RUN ln -s ../lib/node_modules/pnpm/bin/pnpm.cjs /usr/local/bin/pnpm

Das Erweitern des Images ist aber immer noch kaputt, nur anders — das Symlink-Ziel hat kein Execute-Bit:

$ docker run --rm --entrypoint sh n8nio/runners:beta -c 'ls -lL /usr/local/bin/pnpm'
-rw-r--r--    1 root     root           105 Aug 25 13:35 /usr/local/bin/pnpm

(Image-Digest sha256:b6b5f79826a6d41422338e6a3b0b0d56750835dac844d8df630153ddf348dc38)

Also schlägt jeder pnpm-Aufruf in einem abgeleiteten Image fehl:

#13 [stage-1 7/8] RUN cd /opt/runners/task-runner-javascript && pnpm add moment uuid
#13 0.144 /bin/sh: pnpm: Permission denied
#13 ERROR: process "/bin/sh -c cd /opt/runners/task-runner-javascript && pnpm add moment uuid" did not complete successfully: exit code: 126

Exit 126 bedeutet gefunden, aber nicht ausführbar. USER root hilft hier nicht — root umgeht Lese- und Schreibberechtigungsprüfungen, aber nicht Execute: Eine Datei ohne gesetzte Execute-Bits kann von niemandem ausgeführt werden.

Erwähnenswert ist, dass der fehlgeschlagene Befehl wörtlich aus Adding extra dependencies in der Dokumentation kopiert ist, daher wird jeder, der diese Seite auf beta befolgt, darauf stoßen.

Workaround — chmod das Ziel vor der Verwendung von pnpm:

RUN chmod +x /usr/local/lib/node_modules/pnpm/bin/pnpm.cjs && \
    cd /opt/runners/task-runner-javascript && \
    pnpm add \
    moment \
    uuid

Oder überspringe das Execute-Bit komplett und nutze node:

RUN cd /opt/runners/task-runner-javascript && \
    node /usr/local/lib/node_modules/pnpm/bin/pnpm.cjs add moment uuid

Die Lösung auf deiner Seite ist vermutlich COPY --chmod=755 auf dieser Ebene oder ein chmod +x nach ln -s.