【问题标题】:How can I get my NodeJS app to start in Docker如何让我的 NodeJS 应用程序在 Docker 中启动
【发布时间】:2020-05-04 19:17:05
【问题描述】:

我有一个 NodeJS(版本 8)应用程序,我正试图在 Docker 本地运行。

使用时 docker-compose up 构建后,我收到此错误:

app_1       | /app/backend/node_modules/.bin/node: 1: /app/backend/node_modules/.bin/node: �����H: not found
app_1       | /app/backend/node_modules/.bin/node: 2: /app/backend/node_modules/.bin/node: ���H__PAGEZERO__TEXT: not found
app_1       | /app/backend/node_modules/.bin/node: 3: /app/backend/node_modules/.bin/node: Y.__dof_node__TEXT�c.�c.__unwind_info__TEXT�l.�L�l.__eh_frame__TEXTP�/dP�__DATA: not found
app_1       | /app/backend/node_modules/.bin/node: 4: /app/backend/node_modules/.bin/node: Syntax error: "(" unexpected
app_1       | npm ERR! code ELIFECYCLE
app_1       | npm ERR! errno 2
app_1       | npm ERR! app-backend@ start:production: `cross-env NODE_ENV=production nodemon ./server.js`
app_1       | npm ERR! Exit status 2

尝试使用 docker run --rm -it my_app sh 直接运行容器并尝试使用cd backend && npm run start:production 我犯了同样的错误。调试日志说:

0 info it worked if it ends with ok
1 verbose cli [ '/usr/local/bin/node',
1 verbose cli   '/usr/local/bin/npm',
1 verbose cli   'run',
1 verbose cli   'start:production' ]
2 info using npm@6.13.4
3 info using node@v8.17.0
4 verbose run-script [ 'prestart:production',
4 verbose run-script   'start:production',
4 verbose run-script   'poststart:production' ]
5 info lifecycle app-backend@~prestart:production: app-backend@
6 info lifecycle app-backend@~start:production: app-backend@
7 verbose lifecycle app-backend@~start:production: unsafe-perm in lifecycle true
8 verbose lifecycle app-backend@~start:production: PATH: /usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/app/backend/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
9 verbose lifecycle app-backend@~start:production: CWD: /app/backend
10 silly lifecycle app-backend@~start:production: Args: [ '-c', 'cross-env NODE_ENV=production nodemon ./server.js' ]
11 silly lifecycle app-backend@~start:production: Returned: code: 2  signal: null
12 info lifecycle app-backend@~start:production: Failed to exec start:production script
13 verbose stack Error: app-backend@ start:production: `cross-env NODE_ENV=production nodemon ./server.js`
13 verbose stack Exit status 2
13 verbose stack     at EventEmitter.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:332:16)
13 verbose stack     at emitTwo (events.js:126:13)
13 verbose stack     at EventEmitter.emit (events.js:214:7)
13 verbose stack     at ChildProcess.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14)
13 verbose stack     at emitTwo (events.js:126:13)
13 verbose stack     at ChildProcess.emit (events.js:214:7)
13 verbose stack     at maybeClose (internal/child_process.js:915:16)
13 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:209:5)
14 verbose pkgid app-backend@
15 verbose cwd /app/backend
16 verbose Linux 4.19.76-linuxkit
17 verbose argv "/usr/local/bin/node" "/usr/local/bin/npm" "run" "start:production"
18 verbose node v8.17.0
19 verbose npm  v6.13.4
20 error code ELIFECYCLE
21 error errno 2
22 error app-backend@ start:production: `cross-env NODE_ENV=production nodemon ./server.js`
22 error Exit status 2
23 error Failed at the app-backend@ start:production script.
23 error This is probably not a problem with npm. There is likely additional logging output above.
24 verbose exit [ 2, true ] 

任何帮助将不胜感激。

【问题讨论】:

  • 您实际上是如何启动容器的?包括你的Dockerfile 和你的docker-compose.ymldocker run 命令会很有帮助。 (特别是,如果您将 node_modules 目录绑定挂载到容器中,可能会发生这种情况;删除 Compose volumes:docker run -v 选项会对此有所帮助。)
  • 目前我正在使用这个docker run --rm -ti my_app sh,当尝试在其中运行任何 npm 脚本时,我看到了同样的问题

标签: node.js reactjs docker


【解决方案1】:

将您的 NODE_ENV 放在 docker compose 中,如下所示:

  server:
    image: your_image
    environment:
      - NODE_ENV=production

然后你可以将你的 CMD 简化为 CMD ["nodemon", "./server.js"]

【讨论】:

  • 这对我不起作用。在我的容器中,我尝试像这样单独运行 nodemon:npm run env -- nodemon 但得到与上面相同的错误
  • 如果你执行到 docker 容器并尝试启动你的应用程序怎么办? docker exec -it your_image bash
【解决方案2】:

在这里回答我自己的问题,以防有人看到类似的错误: 在我的 package.json 中,我依赖于节点:

"dependencies": {
    ...
    "node": "^8.10.0",
    ...
  }

删除此行后,docker容器正常启动。

【讨论】:

    猜你喜欢
    • 2020-01-27
    • 2017-06-25
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多