Node.js 错误:EACCESS:权限被拒绝,打开';build/FILENAME.js';

Node.js 错误:EACCESS:权限被拒绝,打开';build/FILENAME.js';,node.js,docker,docker-compose,Node.js,Docker,Docker Compose,Docker容器无法启动。 收到以下错误消息 我之前曾尝试在777上设置构建,但它没有任何改变 package.json "scripts": { "start": "nodemon --exec babel-node src/main.js", "build": "babel src --out-dir build", ... 日志 $ babel src --out-dir build dispatcher_1 | { Error: EACCES: permis

Docker容器无法启动。 收到以下错误消息

我之前曾尝试在777上设置
构建
,但它没有任何改变

package.json

"scripts": {
    "start": "nodemon --exec babel-node src/main.js",
    "build": "babel src --out-dir build",
    ...
日志

$ babel src --out-dir build
dispatcher_1   | { Error: EACCES: permission denied, open 'build/CalcUtil.js'
dispatcher_1   |     at Object.openSync (fs.js:439:3)
dispatcher_1   |     at Object.writeFileSync (fs.js:1190:35)
dispatcher_1   |     at outputFileSync (/app/node_modules/output-file-sync/index.js:115:5)
dispatcher_1   |     at /app/node_modules/@babel/cli/lib/babel/dir.js:117:41
dispatcher_1   |     at Generator.next (<anonymous>)
dispatcher_1   |     at asyncGeneratorStep (/app/node_modules/@babel/cli/lib/babel/dir.js:74:103)
dispatcher_1   |     at _next (/app/node_modules/@babel/cli/lib/babel/dir.js:76:194)
dispatcher_1   |   errno: -13,
dispatcher_1   |   syscall: 'open',
dispatcher_1   |   code: 'EACCES',
dispatcher_1   |   path: 'build/CalcUtil.js' }

要启动docker容器,我使用docker compose up-d

错误报告脚本正在尝试打开一个文件,并且没有打开该文件的权限

考虑到所讨论的文件位于
build
目录以及堆栈跟踪中的详细信息,我猜您的脚本正在尝试写入该文件

这里最可能的情况是,容器中没有
build
目录,并且您还没有编写任何代码来创建
build
目录。由于您正在使用
make
来控制构建,而且还没有包含
Makefile
,因此很难确定


查看构建文件,确保直接创建输出(如果缺少)。您可能还希望确保在运行完整生成时清除其内容。

错误报告脚本正在尝试打开文件,但没有打开该文件的权限

考虑到所讨论的文件位于
build
目录以及堆栈跟踪中的详细信息,我猜您的脚本正在尝试写入该文件

这里最可能的情况是,容器中没有
build
目录,并且您还没有编写任何代码来创建
build
目录。由于您正在使用
make
来控制构建,而且还没有包含
Makefile
,因此很难确定


查看构建文件,确保直接创建输出(如果缺少)。您可能还希望确保在运行完整版本时清除其内容。

我想我也会将此评论作为正式答案

因此,在docker-compose.yml文件中,您定义了希望以
用户:“1000:1000”
的身份运行服务调度程序,但当您装入卷时,所有者实际上是
root:root

我认为这是一个Linux特有的问题,当所有者成为docker守护进程的所有者时,在装载卷时会出现权限问题(至少我在多个场合遇到过这种情况)

据我所知,Docker Desktop for Mac上没有出现此问题,卷是以指定用户作为所有者装入的


因此,删除该服务的用户定义将解决这个问题。

我想我也会将该评论作为一个官方答案

因此,在docker-compose.yml文件中,您定义了希望以
用户:“1000:1000”
的身份运行服务调度程序,但当您装入卷时,所有者实际上是
root:root

我认为这是一个Linux特有的问题,当所有者成为docker守护进程的所有者时,在装载卷时会出现权限问题(至少我在多个场合遇到过这种情况)

据我所知,Docker Desktop for Mac上没有出现此问题,卷是以指定用户作为所有者装入的


因此,删除该服务的用户定义将解决此问题。

请提供Dockerfile和/或docker-compose.yml或所需的命令using@KārlisĀbele我只需使用
docker compose up-d
启动docker容器。@markovchain
docker compose.yml
在上面。请尝试运行
docker-compose运行dispatcher sh
并检查您遇到问题的文件的所有者,以及该文件是否与您所使用的用户相同,但在docker-compose.yml中,您的用户为1000:1000,但不是root请提供Dockerfile和/或docker-compose.yml或您正在使用的命令using@KārlisĀbele I仅使用
docker compose up-d
启动docker容器。@markovchain
docker compose.yml
在上面。尝试运行
docker compose运行dispatcher sh
,检查您遇到问题的文件的所有者是什么,以及该文件是否与您被发送到的用户相同,但在docker-compose.yml中,您需要具有非根用户的用户1000:1000
version: '3.1'

volumes:
  db:

services:
  mongodb:
    image: mongo:4.0-xenial
    restart: always
    volumes:
      - db:/data/db

  mongoclient:
    image: mongoclient/mongoclient
    restart: always
    volumes:
      - db:/data/db
    environment:
      - MONGO_URL=mongodb://mongodb/data
      - MONGOCLIENT_DEFAULT_CONNECTION_URL=mongodb://mongodb/data
    ports:
      - "8071:3000"
    depends_on:
      - mongodb

  dispatcher:
    image: node:10
    restart: always
    volumes:
      - ./tmp:/upload_tmp
      - ./:/app
    working_dir: /app
    ports:
      - "8070:8070"
    command: "make build start"
    user: "1000:1000"
    depends_on:
      - mongodb