#!/usr/bin/env bash # ==================== 配置 ==================== REGISTRY="uat.sf.dockerhub.domain" NAMESPACE="fein-namespace" # TODO: 改成你的命名空间 IMAGE_NAME="myapp" # TODO: 改成你的镜像名 # =============================================== IMAGE="${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}" TAG_FILE=".image-tag" CTR="verify-$$" info() { echo "[INFO] $*"; } die() { echo "[ERROR] $*" >&2; exit 1; } cd "$(dirname "$0")" build() { [ -f Dockerfile ] || die "没有 Dockerfile" local tag tag="$(date +%Y%m%d%H%M%S)" info "构建 ${IMAGE}:${tag}" docker build -t "${IMAGE}:${tag}" . echo "${tag}" > "${TAG_FILE}" } read_tag() { local TAG="$(cat "${TAG_FILE}" 2>/dev/null)" if [ -z "${TAG}" ]; then die "${TAG_FILE} 内容为空,请进行构建" fi echo $TAG } verify() { local TAG TAG="$(read_tag)" info "验证 ${IMAGE}:${TAG}" docker run -d --name "${CTR}" "${IMAGE}:${TAG}" >/dev/null sleep 5 if [ "$(docker ps -q -f name="${CTR}" | wc -l)" -gt 0 ]; then info "容器存活,日志:" docker logs --tail 20 "${CTR}" info "✅ 验证通过" else docker logs --tail 50 "${CTR}" die "❌ 容器未存活" fi docker rm -f "${CTR}" >/dev/null } push() { local TAG TAG="$(read_tag)" info "推送 ${IMAGE}:${TAG}" docker push "${IMAGE}:${TAG}" } case "${1:-}" in build) build ;; verify) verify ;; push) push ;; *) die "用法: ./build.sh build|verify|push" ;; esac