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

标签 node.js docker docker-compose

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

  • 在容器内使用非root用户
  • node_modules 保存在容器内(以免“污染”主机上的工作目录)
  • 不使用 Dockerfile

我不确定这些目标是否被视为“最佳实践”。例如,将 node_modules 保存在容器内有它的 disadvantages .

目前我的撰写文件是这样的:

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 将被写入主机(因为 ./projmounted)

我已经阅读了关于该主题的这两篇文章:

但都不符合我的目标。

更新:

我添加了一行ls -lh/home/node/app/,发现node_modulesroot所有。这可能是问题所在。

最佳答案

我最终使用了 Dockerfile。这是最低限度的。 (我保留了一些注释掉的行,任何人都可能会发现它们有用。)

我们需要更改容器内 node_modules 的所有者。 似乎 node:9 图像不需要这个。所以这仅适用于 node:9-alpine. (update: 抱歉。我忘了用 docker system prune 删除构建的容器。两张图片都需要这个。这里是a discussion on permissions/ownership of named volumes`)

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

关于node.js - 如何在使用 docker-compose 和非 root 用户时将 node_modules 保留在容器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49941708/

相关文章:

django - 在 postgres docker 容器中创建用户

docker - 如何为 bbb(蓝色大按钮)编写 docker-compose 文件?

node.js - Node JS 适合作为即时通讯服务吗? MongoDB 适合做数据库吗?

javascript - 如何扩展 GraphQL 调用的上下文对象?

javascript - 使用 IDE (Node) 读取本地存储的 JSON 文件

postgresql - 使用 docker 重启 postgres 时数据丢失

docker - 无法从NiFi发送到Kafka

javascript - 如何测试呈现 View 的 Express Routes

java - Maven 集成测试 2 个模块

linux - 更新 apt 会破坏我在 Ubuntu 18.04 上构建的 docker