运行 nodemon 的 Docker 容器“以代码 0 退出”

Posted

技术标签:

【中文标题】运行 nodemon 的 Docker 容器“以代码 0 退出”【英文标题】:Docker container running nodemon "exited with code 0" 【发布时间】:2019-12-27 07:38:53 【问题描述】:

我跑docker-compose -f docker-compose-base.yml -f docker-compose-dev.yml up

哪些输出:

...
api    |
api    | > api@0.0.0 start:development /usr/src/api
api    | > npm run start:dev
api    |
api    |
api    | > api@0.0.0 start:dev /usr/src/api
api    | > nodemon -L
api    |
api exited with code 0

当我进入容器并使用docker-compose -f docker-compose-base.yml -f docker-compose-dev.yml run --rm api /bin/bash 运行/bin/bash 时,nodemon 运行良好:

# npm run start:dev

> api@0.0.0 start:dev /usr/src/api
> nodemon -L

[nodemon] 1.18.10
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: /usr/src/api/src/**/*
[nodemon] starting `ts-node -r tsconfig-paths/register src/main.ts`

Docker 编写文件:

$ cat docker-compose-base.yml docker-compose-dev.yml

version: "3"

services:
  api:
    build: .
    restart: on-failure
    volumes:
      - ./:/usr/src/api
      - /usr/src/api/node_modules
    env_file:
      - .env
    container_name: api
version: "3"

networks:
  # Use lb_lbnet network created by the load balancer repo (lb)
  # We do this because we need the load balance to resolve container names defined here to forward traffic
  default:
    external:
      name: lb_lbnet

services:
  db:
    image: postgres:11
    container_name: db
    restart: always
    env_file:
    - ./db.env # uses POSTGRES_DB and POSTGRES_PASSWORD to create a fresh db with a password when first run
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
      # only used to upload DB dump:
      # - ./backup:/tmp/backup

  api:
    tty: true
    depends_on:
      - db
    ports:
      - 3000:3000

添加tty: true 没有帮助。

更新:这是用于 api 的 Dockerfile:

FROM node:11

WORKDIR /usr/src/api

COPY package*.json ./

RUN npm install

COPY . .

# not using an execution list here so we get shell variable substitution
CMD npm run start:$NODE_ENV

【问题讨论】:

docker-compose log 是怎么说的? 此外,您的 docker compose 没有图像或构建您的 api 服务。我们可以看到它的 dockerfile 吗?您可能没有 bash 作为您的 CMD 或其他东西 不需要 docker-compose 日志,因为我在没有 -d 的情况下运行 up。刚刚发布了 Dockerfile。 完全莫名其妙。那些小鬼案件之一。我跑了downup 并且无法再重现这个问题。 我还是给了你一个答案,你可能在你的 start:dev 脚本中改变了一些东西,这就是它现在对你有用的原因。 【参考方案1】:

您的 npm 可执行文件“start:dev”要么作为后台任务运行,立即退出,要么运行然后完成并退出。

我建议您将 dockerfile 更改为在末尾添加以下内容,而不是当前的 CMD 行。

COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT /entrypoint.sh "$NODE_ENV"

现在创建一个名为 entrypoint.sh 的文件,并将其放在与 dockerfile 相同的目录中。在您的 entrypoint.sh 中有以下内容。

#!/bin/bash
npm run start:$1 &
bash

【讨论】:

以上是关于运行 nodemon 的 Docker 容器“以代码 0 退出”的主要内容,如果未能解决你的问题,请参考以下文章

文件更改时,两个带有 Nodemon 的后端服务器不会在 docker 容器中重新加载

Docker /bin/bash: nodemon: 找不到命令

Webstorm- Nodemon + Typescript + Docker - 调试器已连接但断点不起作用

如何调试应用程序并使用 nodemon 测试手表

Docker - /bin/sh: nodemon: 未找到

Nodemon 在 Windows Docker 环境中不重启