【问题标题】:(EACCES: permission denied, mkdir '/usr/app/node_modules/.cache) How can I create a docker-compose file to make node_modules a non-root folder?(EACCES:权限被拒绝,mkdir '/usr/app/node_modules/.cache)如何创建 docker-compose 文件以使 node_modules 成为非根文件夹?
【发布时间】:2022-01-18 01:11:30
【问题描述】:

我正在尝试 dockerize 一个简单的 create-react-app 项目。 (是运行npx create-react-app test后的初始项目,没有文件被改变)。

问题似乎是在较新版本的React 中,他们将烦人的.eslintcache 从根文件夹移至/node_modules/.cache,导致容器尝试通过docker-compose 运行应用程序时出现问题。

Dockerfile

FROM node:alpine

WORKDIR /usr/app

COPY package*.json ./

RUN npm install

RUN chown -R node.node /usr/app/node_modules

COPY . ./

CMD ["npm", "start"]

码头工人撰写

version: '3'
services: 
  test:
    stdin_open: true
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - CHOKIDAR_USEPOLLING=true
    volumes:
      - /usr/app/node_modules
      - .:/usr/app
    ports:
      - '3000:3000'

容器正在记录此错误消息:

test_1   | Failed to compile.
test_1   | 
test_1   | EACCES: permission denied, mkdir '/usr/app/node_modules/.cache

如您所见,我尝试将node_modules 文件夹所有者设置为节点用户(node:alpine 的默认用户),但它不起作用;探索容器,您可以看到node_modules 文件夹仍归root 所有:

drwxrwxr-x    5 node     node          4096 Apr 14 07:04 .
drwxr-xr-x    1 root     root          4096 Apr 14 07:08 ..
-rw-rw-r--    1 node     node           310 Apr 14 06:56 .gitignore
-rw-rw-r--    1 node     node           192 Apr 14 07:30 Dockerfile
-rw-rw-r--    1 node     node          3369 Apr 14 06:56 README.md
drwxrwxr-x 1061 root     root         36864 Apr 14 07:12 node_modules
-rw-rw-r--    1 node     node        692936 Apr 14 06:56 package-lock.json
-rw-rw-r--    1 node     node           808 Apr 14 06:56 package.json
drwxrwxr-x    2 node     node          4096 Apr 14 06:56 public
drwxrwxr-x    2 node     node          4096 Apr 14 06:56 src

我还尝试创建文件夹 RUN mkdir -p /usr/app 并使用 USER node,但最终导致 npm 无法创建 node_modules 文件夹的问题。

是否有任何解决方法,其中.eslintcache 被禁用或node_modulesnode 用户所有?

更新

显然,这是因为我使用 Ubuntu 并且 docker 在 Linux 系统上以 root 身份安装卷。

【问题讨论】:

  • 我会删除 volumes: 以便您实际运行映像中内置的代码。这也避免了您所描述的各种权限问题,并且意味着您的package.json 文件的更改将得到尊重。您可以直接运行node,无需Docker 进行开发,也可以运行eslint 等开发人员专用工具。
  • 我想知道我是否可以这样做,因为我想要一个完整的 dockerized 开发环境;我在docker-compose 中有另外两个服务(返回和 mongo)。另外,它似乎在上一个 CRA 版本之后开始发生,我发布的配置在以前的版本中有效。

标签: docker npm docker-compose create-react-app


【解决方案1】:

在 Dockerfile 中的 RUN npm install 之后添加这一行将解决问题:

RUN mkdir -p node_modules/.cache && chmod -R 777 node_modules/.cache

最终的 Dockerfile

FROM node:alpine

WORKDIR /usr/app

COPY package.json .
RUN npm install

RUN mkdir node_modules/.cache && chmod -R 777 node_modules/.cache

COPY . .

CMD ["npm", "run", "start"]

那么您不需要将node_modules 文件夹从本地目录复制到容器中。您可以放心地为它添加书签。

【讨论】:

    【解决方案2】:

    我刚刚偶然发现了同样的问题。如果您想知道我是如何处理它的,我只是在最后一行之前添加了两行。它就像一个魅力。

    FROM node:16.13.0-alpine
    
    WORKDIR /app
    
    COPY package.json ./
    COPY package-lock.json ./
    
    RUN npm config set unsafe-perm true
    RUN npm install --silent
    
    COPY . .
    
    RUN chown -R node /app/node_modules
    
    USER node
    
    CMD ["npm", "start"]
    

    【讨论】:

      【解决方案3】:

      我提出的解决方案是在本地安装 node_modues,然后修改 Dockerfile 以将所有内容复制到容器中并将其用作卷,而不是在构建过程中安装和添加书签 node_modules。我知道这不是解决这个问题的最佳方法,但对于我几天来一直试图解决的问题来说,这是一个简单的解决方案。

      Dockerfile

      FROM node:alpine
      
      WORKDIR /usr/app
      
      COPY . ./
      
      CMD ["npm", "start"]
      

      码头工人撰写

      version: '3'
      services: 
        test:
          stdin_open: true
          build:
            context: .
            dockerfile: Dockerfile.dev
          environment:
            - CHOKIDAR_USEPOLLING=true
          volumes:
            - .:/usr/app
          ports:
            - '3000:3000'
      

      【讨论】:

        【解决方案4】:

        如果您有本地 node_modules 文件夹,请在运行 docker 或 docker-compose 之前将其删除

        因为可能有另一种情况导致 EACCES:权限被拒绝,mkdir '/usr/app/node_modules/.cache

        这可能是您之前使用本地 node_modules 文件运行此 react-app 然后删除该文件以使用容器 node_module 的情况。

        因此,在删除整个文件夹后,它仍会重新创建该文件夹并在其中保留一个 .cache 文件,该文件通常不可见。

        因此,当您在 docker-compose.yml 中使用 `".:/usr/app" 或 -v "$(pwd):/usr/app" 它尝试为存储在该 local_node 模块 repo 中的缓存文件添加书签并引起所有的大惊小怪。

        【讨论】:

          猜你喜欢
          • 2021-07-15
          • 2021-12-31
          • 2019-09-19
          • 2021-08-10
          • 2021-12-22
          • 2023-03-25
          • 1970-01-01
          • 1970-01-01
          • 2018-08-01
          相关资源
          最近更新 更多