Docker Build Tag Push Healthcheck

Script a full container release flow: build with cache pins, tag by digest and git SHA, push, and wait for registry health.

BashCli Tooling

Code

snippet
#!/usr/bin/env bash
set -euo pipefail

readonly REGISTRY="registry.example.com"
readonly IMAGE="${REGISTRY}/billing-api"
readonly GIT_SHA="$(git rev-parse --short=12 HEAD)"

die() { echo "Error: $*" >&2; exit 1; }

command -v docker >/dev/null || die "docker 未安装"
git diff --quiet || die "工作区不干净,先提交再发布"

build() {
  echo "构建 ${IMAGE}:${GIT_SHA}"
  docker build \
    --build-arg GIT_COMMIT="${GIT_SHA}" \
    --label "org.opencontainers.image.revision=${GIT_SHA}" \
    --label "org.opencontainers.image.created=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
    -t "${IMAGE}:${GIT_SHA}" \
    -t "${IMAGE}:latest" \
    .
}

push_and_verify() {
  docker push "${IMAGE}:${GIT_SHA}"
  docker push "${IMAGE}:latest"

  local digest
  digest=$(docker inspect --format '{{index .RepoDigests 0}}' \
    "${IMAGE}:${GIT_SHA}" | cut -d@ -f2)
  echo "已推送: ${IMAGE}@${digest}"

  # registry 健康探测:清单可拉取才算发布完成
  local attempt=0
  until docker manifest inspect "${IMAGE}:${GIT_SHA}" >/dev/null 2>&1; do
    (( attempt++ )) || true
    (( attempt < 5 )) || die "manifest 未就绪,registry 可能异常"
    sleep 3
  done
  echo "发布完成:${GIT_SHA}"
}

build
push_and_verify