如何在脚本退出或崩溃时清理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
关键逻辑说明
trap命令的作用:trap cleanup EXIT SIGINT SIGTERM会告诉Bash,当脚本收到EXIT(任何退出场景)、SIGINT(用户按Ctrl+C)或SIGTERM(进程终止信号)时,自动调用cleanup函数。- 清理逻辑的注册时机:必须在启动服务前注册
trap,确保即使docker-compose up本身执行失败,脚本退出时也会触发清理操作。 - 兼容
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
相关产品推荐
相关产品推荐

