#!/bin/bash # Docker 镜像构建和推送脚本 # 使用方法: ./build_and_push.sh [推送标志] [镜像标签] set -e # 遇到错误立即退出 # 配置变量 IMAGE_NAME="shokku" REGISTRY="ccr.ccs.tencentyun.com" # 替换为您的仓库地址 NAMESPACE="miaogai" # 替换为您的命名空间 DOCKERFILE="Dockerfile" BUILD_CONTEXT="." # 参数处理 PUSH=${1:-"false"} TAG=${2:-"latest"} # 完整的镜像地址 FULL_IMAGE_NAME="${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:${TAG}" echo "=== Docker 镜像构建和推送 ===" echo "镜像名称: ${FULL_IMAGE_NAME}" echo "Dockerfile: ${DOCKERFILE}" echo "构建上下文: ${BUILD_CONTEXT}" # 检查 Docker 是否安装 if ! command -v docker &> /dev/null; then echo "错误: 未找到 Docker,请先安装 Docker" exit 1 fi # 构建镜像 echo "开始构建镜像..." docker build -t ${IMAGE_NAME}:${TAG} -f ${DOCKERFILE} ${BUILD_CONTEXT} # 标记镜像 echo "标记镜像..." docker tag ${IMAGE_NAME}:${TAG} ${FULL_IMAGE_NAME} # 如果需要推送 if [ "$PUSH" = "true" ]; then echo "登录到镜像仓库..." # 检查是否已经登录到目标仓库 if ! docker info 2>/dev/null | grep -q "${REGISTRY}"; then echo "需要登录到镜像仓库: ${REGISTRY}" # 从环境变量获取凭据,如果存在的话 if [ -n "$DOCKER_REGISTRY_USER" ] && [ -n "$DOCKER_REGISTRY_PASSWORD" ]; then echo "使用环境变量中的凭据进行登录..." echo "$DOCKER_REGISTRY_PASSWORD" | docker login ${REGISTRY} --username "$DOCKER_REGISTRY_USER" --password-stdin else # 交互式登录 echo "请输入镜像仓库凭据:" docker login ${REGISTRY} fi # 检查登录是否成功 if [ $? -ne 0 ]; then echo "错误: 镜像仓库登录失败" exit 1 fi else echo "已登录到镜像仓库 ${REGISTRY}" fi echo "推送镜像到仓库..." docker push ${FULL_IMAGE_NAME} echo "✅ 镜像推送完成: ${FULL_IMAGE_NAME}" else echo "ℹ️ 镜像构建完成,未推送 (使用 'true' 作为第1个参数来推送)" fi echo "=== 完成 ==="