我正在寻找一种同时实现这些目标的方法:
node_modules
保留在容器内(以免“污染”主机上的工作目录)
Dockerfile
node_modules
保留在容器内有其缺点。 目前我的撰写文件是这样的:
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
行,容器就会运行,但是
node_modules
将被写入主机(因为
./proj
是mounted) 我已阅读有关该主题的这两篇文章:
更新:
ls -lh /home/node/app/
,发现
node_modules
归
root
所有。这可能就是问题所在。
Dockerfile
。这是最小的。 (我保留了一些注释掉的行,任何人都可能会发现它们有用。)我们需要更改容器内
node_modules
的所有者。看起来
node:9
图像不需要这个。所以这仅适用于
node:9-alpine
。(
docker system prune
删除构建的容器。两个图像都需要这个。这里是关于命名卷的权限/所有权的讨论`)
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
docker-compose.yml
最终变成了这样:
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