如何将Docker镜像自动部署作为Woodpecker CI/CD流水线的最后一步
主流Docker环境下的CI/CD自动部署方案(非Kubernetes)
1. Docker Context远程执行(官方推荐)
这是最贴合Docker生态的远程管理方式,替代直接SSH的零散命令:
- VPS端配置:修改Docker daemon配置文件
/etc/docker/daemon.json,开启远程访问(生产环境务必配TLS加密):
重启Docker服务:{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"] }systemctl restart docker - Woodpecker流水线步骤:
# 创建并切换到远程VPS的Docker上下文 docker context create remote-vps --docker "host=tcp://<VPS_IP>:2376" docker context use remote-vps # 拉取镜像并重启应用 docker pull <GITEA_REGISTRY>/<IMAGE_NAME>:<TAG> docker stop <CONTAINER_NAME> || true docker rm <CONTAINER_NAME> || true docker run -d --name <CONTAINER_NAME> -p <PORT>:<PORT> <GITEA_REGISTRY>/<IMAGE_NAME>:<TAG> - 优势:完全基于Docker原生工具,无需额外依赖,命令统一规范。
2. Docker Compose远程部署(适合多服务场景)
如果应用用Compose管理,这个方案更简洁可控:
- VPS端准备:提前放好
docker-compose.yml,镜像地址指向你的Gitea仓库:services: app: image: <GITEA_REGISTRY>/<IMAGE_NAME>:<TAG> ports: - "<PORT>:<PORT>" restart: always - Woodpecker流水线步骤:
# 连接远程Docker上下文(同方案1配置) docker context use remote-vps # 拉新镜像并重启服务 docker-compose -f /path/to/docker-compose.yml pull docker-compose -f /path/to/docker-compose.yml up -d - 优势:配置集中管理,更新操作更简洁,支持多服务协同部署。
3. Webhook触发部署(解耦CI与部署端)
通过Webhook实现CI流水线和部署服务器的解耦:
- VPS端部署Web服务:用Python/Go写轻量服务,监听POST请求,触发部署脚本。示例
deploy.sh:#!/bin/bash docker pull <GITEA_REGISTRY>/<IMAGE_NAME>:<TAG> docker stop <CONTAINER_NAME> || true docker rm <CONTAINER_NAME> || true docker run -d --name <CONTAINER_NAME> -p <PORT>:<PORT> <GITEA_REGISTRY>/<IMAGE_NAME>:<TAG> - Woodpecker流水线步骤:
# 带鉴权的Webhook请求(比如加API Key参数) curl -X POST -H "X-API-Key: <YOUR_KEY>" http://<VPS_IP>:<PORT>/deploy - 优势:CI无需直接访问VPS,可扩展日志、告警、灰度发布等功能,安全性更高。
4. 规范版SSH执行脚本
如果偏好SSH,通过以下方式提升规范性:
- 在Woodpecker中配置SSH密钥为保密变量,避免硬编码凭证
- 在VPS创建专用部署用户,仅授予Docker操作权限,通过
authorized_keys限制可执行命令:command="/path/to/deploy.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding <SSH_PUB_KEY> - Woodpecker流水线步骤:
ssh deploy@<VPS_IP> "/path/to/deploy.sh <IMAGE_TAG>" - 优势:保留SSH通用性,通过权限控制和保密变量降低风险。
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

