#!/usr/bin/env bash set -euo pipefail # ========== 脚本配置 ========== # IMAGE_NAME="git.jinshen.cn/remilia/jinshen-website" # 含仓库前缀的镜像名称 DOCKERFILE="Dockerfile" # Dockerfile 文件路径 BUILD_CONTEXT="." # 构建上下文路径 PUSH_IMAGE=true # 是否推送镜像到远程仓库 DOCKER_LOGIN=false # 是否需要登录 Docker 仓库 REGISTRY_USER="" #Docker 仓库用户名 REGISTRY_PASSWORD="" #Docker 仓库密码 # ============================== # 生成时间戳TAG TIMESTAMP_TAG=$(date +'%Y%m%d%H%M%S') BUILD_TIME=$(date +"%Y-%m-%d %H:%M:%S") GIT_COMMIT=$(git rev-parse --short HEAD || echo "unknown") echo "📦 构建镜像: ${IMAGE_NAME}" echo "⏱️ 时间戳标签: ${TIMESTAMP_TAG}" echo "🔖 Git 提交: ${GIT_COMMIT}" echo "⭐ 同时构建 latest 标签" # docker login(如果启用) if [ "$DOCKER_LOGIN" = true ]; then if [ -z "$REGISTRY_PASSWORD" ]; then echo "❌ 登录失败:启用了 DOCKER_LOGIN,但 REGISTRY_PASSWORD 为空" exit 1 fi echo "🔐 正在登录 Docker Registry..." echo "$REGISTRY_PASSWORD" | docker login "$(echo "$IMAGE_NAME" | cut -d'/' -f1)" \ --username "$REGISTRY_USER" --password-stdin fi # 根据是否推送决定 buildx 参数 if [ "$PUSH_IMAGE" = true ]; then BUILDX_MODE="--push" echo "🚀 将构建并推送镜像到仓库" else BUILDX_MODE="--load" echo "🛠️ 仅本地构建镜像(不推送)" fi # 构建镜像(带 version metadata) docker buildx build \ -t "${IMAGE_NAME}:${TIMESTAMP_TAG}" \ -t "${IMAGE_NAME}:latest" \ --build-arg BUILD_TIME="$BUILD_TIME" \ --build-arg GIT_COMMIT="$GIT_COMMIT" \ -f "$DOCKERFILE" "$BUILD_CONTEXT" \ $BUILDX_MODE echo "🎉 镜像构建完成!" echo "📌 可用镜像:" echo " - ${IMAGE_NAME}:${TIMESTAMP_TAG}" echo " - ${IMAGE_NAME}:latest" if [ "$PUSH_IMAGE" = false ]; then echo "⚠️ 镜像未推送(PUSH_IMAGE=false)" fi