Docker测试环境一键销毁的核心是声明式管理与彻底清理:用docker-compose.yml定义服务、网络和命名卷,执行docker-compose down -v删除全部资源;辅以teardown.sh脚本清理孤立网络、镜像及残留容器;临时测试可结合--rm和--tmpfs实现零残留;CI/CD中通过after_script自动触发销毁,确保环境纯净。

核心是用 docker-compose 统一定义环境,配合 --rm、-v 和脚本化清理,做到“一键销毁、秒级重建”。
用 docker-compose.yml 定义整套环境
不要手动 docker run 多个容器。把 web、db、cache 等服务、自定义网络、命名卷(如 db-data:)全部写进 docker-compose.yml。这样:
- 启动只需:docker-compose up -d
- 销毁基础资源(停容器、删网络、删临时卷):docker-compose down
- 连命名卷也清掉(含数据库数据):docker-compose down -v
- 注意:卷必须声明为 named volumes,不能写成 ./data:/var/lib/mysql 这类绑定宿主机路径,否则 -v 不会清理它
对纯临时测试,直接用 --rm + 无卷模式
比如跑一次单元测试、接口冒烟或 SQL 验证,根本不需要持久化:
- 启动时加 --rm:容器退出后自动删除自身
- 数据库跳过挂载卷,只设环境变量:-e MYSQL_ROOT_PASSWORD=test
- 用 --tmpfs /tmp 或 -v /tmp 避免落盘
- 这种场景下,“销毁”就是关掉终端——连命令都不用输
写 teardown.sh 脚本兜底清理
避免漏掉 compose 之外的残留,封装成可执行脚本更可靠:
- 执行 docker-compose down -v
- 清理孤立网络:docker network prune -f
- 删带 test 标签的镜像:docker image prune -f -a --filter "label=env=test"
- 强制删匹配 test_ 前缀的容器:docker rm -f $(docker ps -aq --filter "name=test_") 2>/dev/null || true
运行前给权限:chmod +x teardown.sh && ./teardown.sh
在 CI/CD 中自动触发销毁
让每次测试完都自动清场,不堆积僵尸资源:
- 在 GitLab CI 或 GitHub Actions 的 after_script 或 cleanup job 中调用 teardown.sh
- 用 if: always 确保无论测试成功失败都执行
- 把 docker-compose.yml 和 teardown.sh 一起提交进代码库,保证销毁逻辑和环境定义同步演进
- 敏感配置(如 DB 密码)通过 CI 变量注入,不在 yml 里硬编码











