#!/bin/bash # Life Echo API Docker 镜像构建脚本 set -e # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 配置 IMAGE_NAME="life-echo-api" VERSION="${1:-latest}" REGISTRY="${REGISTRY:-}" DOCKERFILE="${DOCKERFILE:-Dockerfile}" BUILD_CONTEXT="${BUILD_CONTEXT:-.}" # 显示帮助信息 show_help() { echo "用法: $0 [选项] [版本]" echo "" echo "选项:" echo " -h, --help 显示帮助信息" echo " -v, --version VER 指定镜像版本(默认: latest)" echo " -r, --registry REG 指定镜像仓库(可选)" echo " -f, --file FILE 指定Dockerfile路径(默认: Dockerfile)" echo " -p, --push 构建后推送到仓库" echo " -t, --tag TAG 添加额外的标签" echo "" echo "示例:" echo " $0 # 构建 latest 版本" echo " $0 -v v1.0.0 # 构建 v1.0.0 版本" echo " $0 -r registry.example.com # 指定镜像仓库" echo " $0 -v v1.0.0 -p # 构建并推送" echo "" } # 解析参数 PUSH=false EXTRA_TAGS=() while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_help exit 0 ;; -v|--version) VERSION="$2" shift 2 ;; -r|--registry) REGISTRY="$2" shift 2 ;; -f|--file) DOCKERFILE="$2" shift 2 ;; -p|--push) PUSH=true shift ;; -t|--tag) EXTRA_TAGS+=("$2") shift 2 ;; *) if [[ -z "$VERSION" || "$VERSION" == "latest" ]]; then VERSION="$1" fi shift ;; esac done # 构建镜像名称 if [[ -n "$REGISTRY" ]]; then FULL_IMAGE_NAME="${REGISTRY}/${IMAGE_NAME}:${VERSION}" else FULL_IMAGE_NAME="${IMAGE_NAME}:${VERSION}" fi echo -e "${GREEN}开始构建 Docker 镜像...${NC}" echo -e "镜像名称: ${YELLOW}${FULL_IMAGE_NAME}${NC}" echo -e "Dockerfile: ${YELLOW}${DOCKERFILE}${NC}" echo -e "构建上下文: ${YELLOW}${BUILD_CONTEXT}${NC}" echo "" # 构建镜像 echo -e "${GREEN}执行构建命令...${NC}" docker build \ -f "${DOCKERFILE}" \ -t "${FULL_IMAGE_NAME}" \ "${BUILD_CONTEXT}" # 添加额外标签 for tag in "${EXTRA_TAGS[@]}"; do if [[ -n "$REGISTRY" ]]; then TAG_NAME="${REGISTRY}/${IMAGE_NAME}:${tag}" else TAG_NAME="${IMAGE_NAME}:${tag}" fi echo -e "${GREEN}添加标签: ${TAG_NAME}${NC}" docker tag "${FULL_IMAGE_NAME}" "${TAG_NAME}" done # 显示构建结果 echo "" echo -e "${GREEN}构建完成!${NC}" echo -e "镜像: ${YELLOW}${FULL_IMAGE_NAME}${NC}" # 显示镜像信息 echo "" echo -e "${GREEN}镜像信息:${NC}" docker images "${FULL_IMAGE_NAME}" --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}" # 推送到仓库 if [[ "$PUSH" == true ]]; then echo "" echo -e "${GREEN}推送镜像到仓库...${NC}" docker push "${FULL_IMAGE_NAME}" for tag in "${EXTRA_TAGS[@]}"; do if [[ -n "$REGISTRY" ]]; then TAG_NAME="${REGISTRY}/${IMAGE_NAME}:${tag}" else TAG_NAME="${IMAGE_NAME}:${tag}" fi docker push "${TAG_NAME}" done echo -e "${GREEN}推送完成!${NC}" fi echo "" echo -e "${GREEN}完成!${NC}"