web-dev-qa-db-fra.com

Comment conserver node_modules dans un conteneur tout en utilisant docker-compose et un utilisateur non root?

Je cherche un moyen d'atteindre ces objectifs en même temps:

  • en utilisant un utilisateur non root dans le conteneur
  • garder node_modules dans le conteneur (pour ne pas "polluer" le répertoire de travail sur l'hôte)
  • ne pas utiliser une Dockerfile

Je ne sais pas si ces objectifs sont considérés comme des "meilleures pratiques". Par exemple, garder node_modules à l'intérieur du conteneur a ses inconvénients .

Actuellement, mon fichier de composition est comme ceci:

services:
  # ...

  node:
    image: "node:9"
    user: "node"
    working_dir: /home/node/app
    environment:
      # - NODE_ENV=production
      - NPM_CONFIG_PREFIX=/home/node/.npm-global
      - PATH=$PATH:/home/node/.npm-global/bin
    volumes:
      - ./proj/:/home/node/app
      - /home/node/app/node_modules # mark1
    ports:
      - "3001:3001"
    command: >
      bash -c "echo hello
      && ls -lh /home/node/app/ 
      && npm install
      && npm i -g babel-cli
      && npm i -g flow-bin
      && npm start"
    depends_on:
      - redis

mais il y'à

"Error: EACCES: permission denied, access'/home/node/app/node_modules'".

Si je commente la ligne #mark1, le conteneur s'exécute, cependant node_modules sera écrit sur l'hôte (puisque ./proj est monté )

J'ai lu ces deux articles sur le sujet:

mais ni l'un ni l'autre ne rencontre mon objectif.

Mettre à jour:

J'ai ajouté une ligne de ls -lh /home/node/app/ et trouvé node_modules appartient à root. Cela pourrait être le problème.

7
LShi

J'ai fini par utiliser un Dockerfile. C'est minimum. (Je garde quelques lignes commentées pour que tout le monde puisse les trouver utiles.)

Nous devons changer le propriétaire de node_modules à l'intérieur du conteneur. Il semble que l'image node:9 ne l'exige pas. Donc, cela ne concerne que node:9-Alpine. ( update : Désolé. J'ai oublié de supprimer le conteneur construit avec docker system Prune. Les deux images en ont besoin. Voici une discussion sur les autorisations/la propriété des volumes nommés` )

FROM node:9-Alpine

#ENV NPM_CONFIG_PREFIX=/home/node/.npm-global
#ENV PATH=$PATH:/home/node/.npm-global/bin

RUN mkdir -p /home/node/app/node_modules
RUN chown -R node:node /home/node/app

#USER node

#WORKDIR /home/node/app

#RUN npm install --silent --progress=false ; \
#    npm i -g babel-cli --silent --progress=false ;\
#    npm i -g flow-bin --silent --progress=false

Le docker-compose.yml a fini par ressembler à:

services:
  # ...
  node:
    # image: "node:9-Alpine"
    build: ./proj
    user: "node"
    working_dir: /home/node/app
    environment:
      # - NODE_ENV=production
      - NPM_CONFIG_PREFIX=/home/node/.npm-global
      - PATH=$PATH:/home/node/.npm-global/bin
    volumes:
      - ./proj/:/home/node/app
      - /home/node/app/node_modules/
    ports:
      - "3006:3001"
    command: >
      /bin/sh -c "echo hello
      && ls -lh /home/node/app/
      && npm install
      && npm i -g babel-cli
      && npm i -g flow-bin
      && npm start"
    depends_on:
      - redis
1
LShi