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

如何在脚本退出或崩溃时清理Docker Compose服务?

确保测试脚本无论成败都能关闭Docker服务的解决方案

问题核心:当前脚本中set -e会在测试脚本tests.sh执行失败时立即终止脚本,导致后续的docker-compose down命令无法执行,残留Docker服务容器。

解决方法:使用Bash的trap命令捕获退出信号

通过注册退出信号处理逻辑,让脚本无论正常结束还是异常退出,都会自动执行Docker服务的关闭操作。

修改后的完整脚本

#!/bin/bash

set -e

cd "$(dirname "${BASH_SOURCE[0]}")"

# 定义清理函数:负责关闭Docker服务
cleanup() {
    echo "开始清理Docker服务..."
    docker-compose down --rmi all --remove-orphans
}

# 注册退出信号处理:无论脚本因何种原因退出,都执行cleanup
# 额外捕获SIGINT(Ctrl+C)和SIGTERM信号,覆盖强制终止场景
trap cleanup EXIT SIGINT SIGTERM

# 启动Docker服务
docker-compose up --detach

# 运行测试逻辑
./tests.sh

关键逻辑说明

  1. trap命令的作用:trap cleanup EXIT SIGINT SIGTERM会告诉Bash,当脚本收到EXIT(任何退出场景)、SIGINT(用户按Ctrl+C)或SIGTERM(进程终止信号)时,自动调用cleanup函数。
  2. 清理逻辑的注册时机:必须在启动服务前注册trap,确保即使docker-compose up本身执行失败,脚本退出时也会触发清理操作。
  3. 兼容set -e:set -e依然可以保留,它会在命令执行失败时立即终止脚本,但trap注册的退出逻辑会在终止前执行,两者不会冲突。

简化写法(无需函数)

如果不需要额外日志或扩展逻辑,也可以直接把关闭命令写在trap中:

#!/bin/bash

set -e

cd "$(dirname "${BASH_SOURCE[0]}")"

trap "docker-compose down --rmi all --remove-orphans" EXIT SIGINT SIGTERM

docker-compose up --detach
./tests.sh

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:15:45