我正在寻找一种同时实现以下目标的方法:
当前我的compose文件如下:
- 在容器中使用非root用户
- 将
node_modules
保存在容器内(以避免在主机的工作目录中“污染”该目录) - 不使用
Dockerfile
node_modules
保存在容器内具有其缺点。当前我的compose文件如下:
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
但是出现了以下错误:
"Error: EACCES: permission denied, access
'/home/node/app/node_modules'".
如果我注释掉#mark1
行,容器将会运行,但是由于./proj
被挂载,node_modules
会被写入到主机上。
关于这个问题,我已经阅读了以下两篇文章:
- https://blog.getjaco.com/jaco-labs-nodejs-docker-missing-manual/
- http://jdlm.info/articles/2016/03/06/lessons-building-node-app-docker.html
但是都没有达到我的目的。
更新:
我添加了一行ls -lh /home/node/app/
,发现node_modules
被root
所拥有。这可能是问题的原因。
./proj/:/home/node/.......
吗?这样它就相对于 Docker 数据目录,而不是绝对位置了吧? - Tiago