错误:EACCESS:权限被拒绝,请打开“ build / FILENAME.js”

时间:2019-06-19 13:40:15

标签: node.js docker docker-compose

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

我以前曾尝试在777上设置build,但它什么也没有改变。

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-compose.yml

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

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

2 个答案:

答案 0 :(得分:1)

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

因此,在docker-compose.yml文件中,您已定义希望以user: "1000:1000"的身份运行服务调度程序,但是在装入卷后,所有者实际上是root:root

我相信这是Linux特定的问题,因为当所有者成为拥有docker守护程序的用户时,安装卷时具有权限(至少我多次遇到过此问题)

据我所知,在Mac上的Docker Desktop上不会发生此问题,并且已使用指定用户作为所有者挂载了卷。

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

答案 1 :(得分:0)

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

鉴于该文件位于build目录中,以及堆栈跟踪中的详细信息,我猜测您的脚本正在尝试将该文件写入

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

查看您的构建文件,并确保直接创建输出(如果缺少)。您可能还需要确保每次运行完整版本时都清除其内容。