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

8
我正在寻找一种同时实现以下目标的方法:
  • 在容器中使用非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会被写入到主机上。

关于这个问题,我已经阅读了以下两篇文章:

但是都没有达到我的目的。

更新:

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


这不是同一个问题。在那个问题中,他们使用了root用户。 - LShi
你的 Node 模块的卷应该不是 ./proj/:/home/node/....... 吗?这样它就相对于 Docker 数据目录,而不是绝对位置了吧? - Tiago
由于没有使用Dockerfile,我将项目文件提供给容器。 - LShi
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接