运行 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。
完全莫名其妙。那些小鬼案件之一。我跑了down
和up
并且无法再重现这个问题。
我还是给了你一个答案,你可能在你的 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 - 调试器已连接但断点不起作用