Je cherche un moyen d'atteindre ces objectifs en même temps:
node_modules
dans le conteneur (pour ne pas "polluer" le répertoire de travail sur l'hôte)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.
J'ai ajouté une ligne de ls -lh /home/node/app/
et trouvé node_modules
appartient à root
. Cela pourrait être le problème.
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 ( update : Désolé. J'ai oublié de supprimer le conteneur construit avec node:9
ne l'exige pas. Donc, cela ne concerne que node:9-Alpine
.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