You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

docker-compose --abort-on-container-exit退出终端后失效问题咨询

问题描述

使用docker-compose up --build --abort-on-container-exit启动应用时:

  • 保持终端打开:first-test容器抛出错误退出后,所有容器都会被终止,参数正常生效。
  • 提前关闭终端:first-test容器后续抛出错误退出,但second-test容器仍持续运行,参数未生效。

示例项目结构

  • first-test.js
  • second-test.js
  • docker-compose.yml
  • first-test.Dockerfile
  • second-test.Dockerfile
  • package.json

first-test.js

async function foo1() {
  for (let i = 0; i < 1000; i++) {
    console.log(i);
    if (i === 20) {
      throw "Error";
    }
    await new Promise(resolve => setTimeout(resolve, 1000));
}
}

foo1();

second-test.js

async function foo2() {
  for (let i = 0; i < 1000; i++) {
    console.log(i);
    await new Promise(resolve => setTimeout(resolve, 1000));
  }
}

foo2();

first-test.Dockerfile

FROM node:21
WORKDIR /usr/src/app
COPY . ./
RUN npm install
CMD [ "node", "first-test.js" ]

second-test.Dockerfile

FROM node:21
WORKDIR /usr/src/app
COPY . ./
RUN npm install
CMD [ "node", "second-test.js" ]

docker-compose.yml

version: "3.8"
services:
  first-test:
    build:
      context: ./
      dockerfile: ./first-test.Dockerfile

  second-test:
    build:
      context: ./
      dockerfile: ./second-test.Dockerfile
问题原因

--abort-on-container-exit的核心逻辑是由前台运行的docker-compose进程实现的:它会持续监听所有服务容器的状态,一旦检测到任意一个容器退出,就主动向其余容器发送终止信号,随后自身退出。

当你提前关闭终端时,终端会向当前前台的docker-compose进程发送SIGHUP(挂起)信号,直接终止docker-compose进程。此时没有进程再去监控容器状态、执行“终止其余容器”的操作,因此未出错的second-test容器会继续运行。

解决方案

1. 维持docker-compose进程后台存活

让docker-compose脱离终端运行,即使关闭终端也能保持进程存活,继续监控容器状态:

  • 使用nohup命令:
    nohup docker-compose up --build --abort-on-container-exit &
    
    日志会默认写入当前目录的nohup.out文件,可通过docker-compose logs随时查看。
  • 使用终端复用工具(如screen/tmux):
    # 创建会话并运行命令
    screen -S test-session docker-compose up --build --abort-on-container-exit
    # 按Ctrl+A+D断开会话,关闭终端后会话仍在运行
    # 重新连接会话:screen -r test-session
    

2. 基于Docker容器依赖实现自动终止

如果不需要依赖docker-compose进程监控,可通过docker-compose.yml的健康检查和依赖配置,让second-test容器随first-test容器的退出而终止:

version: "3.8"
services:
  first-test:
    build:
      context: ./
      dockerfile: ./first-test.Dockerfile
    restart: no
    healthcheck:
      test: ["CMD-SHELL", "pgrep -x node || exit 1"]
      interval: 5s
      timeout: 3s
      retries: 2

  second-test:
    build:
      context: ./
      dockerfile: ./second-test.Dockerfile
    restart: no
    depends_on:
      first-test:
        condition: service_healthy

此配置通过健康检查监控first-test容器的存活状态,一旦first-test退出,second-test会因依赖的服务不健康而自动停止(需确保容器内安装了pgrep,可在Dockerfile中添加RUN apt-get update && apt-get install -y procps)。


内容的提问来源于stack exchange,提问作者tung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:36:03