docker compose 在 ci/cd 中仅用于 cd 阶段部署,不参与构建:ci 负责测试、构建镜像并推送至仓库;cd 在目标机执行 docker compose up -d 拉取并启动服务,需预装 docker/compose、配置权限,并通过 ssh/ansible/webhook 安全触发。

Docker Compose 本身不直接运行在 CI/CD 平台中,但它作为“部署执行器”和“环境编排器”,在 CI/CD 流水线的最后阶段(部署)起关键作用:把已构建、已验证的镜像,按预设拓扑一键拉起多容器服务。核心不是让 Compose 构建镜像,而是让它消费镜像、启动服务。
明确各环节分工:CI 做验证,CD 用 Compose 部署
CI 阶段(如 GitHub Actions 或 GitLab CI 的 test/build)负责:
- 运行单元测试、集成测试(可基于 docker-compose.yml 启动临时测试环境,含 DB、Redis 等依赖)
- 构建应用镜像并推送到镜像仓库(如 GitLab Container Registry、Harbor)
- 不在此阶段执行 docker compose up —— 这会污染 CI 运行器环境,也不符合隔离原则
CD 阶段(通常是独立的部署服务器或目标环境)才真正调用 docker-compose:
- 从镜像仓库拉取最新版镜像(如 myapp:main-20260813)
- 用更新后的 docker-compose.yml(镜像 tag 已替换)执行 docker compose up -d
- 支持滚动重启、健康检查、回滚(通过 git tag 或环境变量控制版本)
部署目标机需预装并配置好 Docker 和 Compose
确保目标服务器(生产/测试机)满足基础条件:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- Docker Engine 已安装并运行(systemctl is-active docker 返回 active)
- Docker Compose v2+ 已就位(docker compose version 可查,推荐 v2.20+)
- 部署用户有权限执行 docker 命令(通常加入 docker 组)
- 项目目录结构清晰,包含:docker-compose.yml、.env(存环境变量)、可能还有 nginx.conf 或 secrets/
用 CI 触发远程部署:三种常用方式
CI 平台不能直接操作生产机,需通过安全方式触发部署动作:
- SSH 执行命令:CI 脚本中用 ssh-key 登录目标机,cd 到项目目录,执行 git pull && docker compose pull && docker compose up -d
- Ansible Playbook:定义部署任务(拉镜像、重载 compose),CI 中调用 ansible-playbook 命令
- Webhook + 轻量服务:目标机运行一个简单 HTTP 服务(如 Python Flask),接收 CI 发来的 token 验证请求后自动执行部署脚本
注意:所有敏感信息(SSH 密钥、registry 凭据)必须通过 CI 平台的 secret 机制注入,绝不硬编码。
docker-compose.yml 要适配自动化场景
避免本地开发习惯,让文件能被流水线稳定使用:
- 镜像名用变量:写成 image: ${REGISTRY}/myapp:${TAG:-latest},CI 中传入 TAG=main-20260813
- 移除 build: 段——部署阶段只拉镜像,不构建
- 挂载路径用绝对路径或相对项目根目录,避免依赖本地路径(如 ./data:/app/data)
- 启用健康检查与 restart 策略(restart: unless-stopped),提升服务韧性










