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
rootvermeiden. 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
nvmist fuer interaktive Shells gedacht.- Docker nutzt standardmaessig
/bin/sh, nicht/bin/bash. source ~/.bashrcgreift oft nicht, daher fehlenNVM_DIRundPATH.
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 deniedsh: 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
nvmim Docker nur nutzen, wenn du wirklich viele Node Versionen brauchst.- Fuer stabile Builds: pinned Node Version, non-root User, und moeglichst wenige globale Installs.