如何在使用 docker-compose 和非 root 用户时将 node_modules 保留在容器内?

问题描述 投票:0回答:1

我正在寻找一种同时实现这些目标的方法:

  • 在容器内使用非root用户
  • 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

我已阅读有关该主题的这两篇文章:

  • 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
所有。这可能就是问题所在。

node.js docker docker-compose
1个回答
3
投票
我最终使用了

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
    
© www.soinside.com 2019 - 2024. All rights reserved.