TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸

Installing Node inside Docker Ubuntu and installing npm packages globally as root

May 30, 2021

Ziel

Node.js in einem Ubuntu Container installieren und globale npm Pakete nutzen, ohne an Permissions zu scheitern.

Empfehlung (kurz)

  • Wenn moeglich: offizielles node: Image nutzen.
  • Wenn du Ubuntu brauchst: Node ueber NodeSource installieren, nicht ueber nvm.
  • Globale Installs als root vermeiden. Besser: non-root User anlegen.

Beispiel: Node via NodeSource

code
FROM ubuntu:22.04

ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update -qq && \
    apt-get install -qq --no-install-recommends ca-certificates curl && \
    curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \
    apt-get install -qq nodejs && \
    rm -rf /var/lib/apt/lists/*

CMD ["bash"]

Warum nvm im Docker oft nervt

  • nvm ist fuer interaktive Shells gedacht.
  • Docker nutzt standardmaessig /bin/sh, nicht /bin/bash.
  • source ~/.bashrc greift oft nicht, daher fehlen NVM_DIR und PATH.

Wenn du nvm trotzdem nutzt, setze NVM_DIR und PATH explizit:

code
ENV NVM_DIR=/root/.nvm
ENV PATH="/root/.nvm/versions/node/v${NODE_VERSION}/bin:${PATH}"

Globale npm Installs als root

Root + globale Installs fuehren oft zu:

  • EACCES: permission denied
  • sh: 1: node: Permission denied

Ursache: npm wechselt fuer Postinstall Scripts den User (default nobody). Das bricht, wenn root erwartet wird.

Loesung 1: Nicht als root installieren (empfohlen)

code
RUN useradd -m app && \
    mkdir -p /app && chown -R app:app /app
USER app

Loesung 2: unsafe-perm und allow-root

code
npm i -g --unsafe-perm --allow-root expo-cli

Oder global im Container:

code
npm config set user 0
npm config set unsafe-perm true
npm i -g expo-cli

Fazit

  • nvm im Docker nur nutzen, wenn du wirklich viele Node Versionen brauchst.
  • Fuer stabile Builds: pinned Node Version, non-root User, und moeglichst wenige globale Installs.

Links