#!/usr/bin/env bash # 不自动运行:单机 Docker Compose 部署脚本示例——拉取指定版本、健康检查、失败自动回滚 # 用法:IMAGE_TAG=<提交哈希> ./deploy.sh # 约定:compose.yaml 里 api 服务的镜像写成 image: registry.example.com/app/api:${IMAGE_TAG} set -euo pipefail : "${IMAGE_TAG:?需要指定 IMAGE_TAG}" HEALTH_URL="${HEALTH_URL:-http://127.0.0.1:8080/healthz}" STATE_FILE="${STATE_FILE:-.deployed_tag}" previous="$(cat "$STATE_FILE" 2>/dev/null || true)" deploy() { local tag="$1" echo "部署版本 $tag" IMAGE_TAG="$tag" docker compose pull api IMAGE_TAG="$tag" docker compose up -d --no-deps api } healthy() { for _ in $(seq 1 30); do if curl -fsS --max-time 2 "$HEALTH_URL" >/dev/null; then return 0 fi sleep 2 done return 1 } deploy "$IMAGE_TAG" if healthy; then echo "$IMAGE_TAG" > "$STATE_FILE" echo "部署成功:$IMAGE_TAG" else echo "健康检查失败" >&2 if [[ -n "$previous" ]]; then echo "回滚到 $previous" >&2 deploy "$previous" healthy && echo "已回滚到 $previous" >&2 fi exit 1 fi