阶段2(下):运维专题 Docker/Nginx/Linux/CI-CD/Git 的课程、企业场景、面试题和可运行示例
This commit is contained in:
1 parent
5eb67c5d08
commit
b8010a74f3
42 files changed
+3533
-55
No files matched your search
@@ -0,0 +1,41 @@
|
||||
#!/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
|
||||
Reference in new issue
Block a user