diff --git a/Dockerfile b/Dockerfile index 6bdcd94f..27ae0b56 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,10 +6,14 @@ # Stage 3: Final minimal image # ============================================================================= +ARG NODE_IMAGE=node:24-alpine +ARG GOLANG_IMAGE=golang:1.25-alpine +ARG ALPINE_IMAGE=alpine:3.19 + # ----------------------------------------------------------------------------- # Stage 1: Frontend Builder # ----------------------------------------------------------------------------- -FROM node:24-alpine AS frontend-builder +FROM ${NODE_IMAGE} AS frontend-builder WORKDIR /app/frontend @@ -24,7 +28,7 @@ RUN npm run build # ----------------------------------------------------------------------------- # Stage 2: Backend Builder # ----------------------------------------------------------------------------- -FROM golang:1.25-alpine AS backend-builder +FROM ${GOLANG_IMAGE} AS backend-builder # Build arguments for version info (set by CI) ARG VERSION=docker @@ -56,7 +60,7 @@ RUN CGO_ENABLED=0 GOOS=linux go build \ # ----------------------------------------------------------------------------- # Stage 3: Final Runtime Image # ----------------------------------------------------------------------------- -FROM alpine:3.19 +FROM ${ALPINE_IMAGE} # Labels LABEL maintainer="Wei-Shaw " diff --git a/build_docker.sh b/build_docker.sh index 0d6f70d7..88b514f5 100755 --- a/build_docker.sh +++ b/build_docker.sh @@ -7,11 +7,12 @@ # ./build_docker.sh [选项] # # 选项: -# -t, --tag TAG 指定镜像标签 (默认: latest) -# -r, --registry REG 指定镜像仓库地址 (默认: 无) -# -p, --push 构建后推送镜像到仓库 -# --no-cache 不使用 Docker 构建缓存 -# -h, --help 显示帮助信息 +# -t, --tag TAG 指定镜像标签 (默认: latest) +# -r, --registry REG 指定镜像仓库地址 (默认: 无) +# -b, --base-registry REG 指定基础镜像仓库地址 (默认: 使用 docker.io) +# -p, --push 构建后推送镜像到仓库 +# --no-cache 不使用 Docker 构建缓存 +# -h, --help 显示帮助信息 # # 示例: # ./build_docker.sh # 构建 sub2api:latest @@ -38,6 +39,7 @@ NC='\033[0m' # No Color IMAGE_NAME="sub2api" TAG="latest" REGISTRY="" +BASE_IMAGE_REGISTRY="${BASE_IMAGE_REGISTRY:-}" PUSH=false NO_CACHE="" @@ -82,6 +84,10 @@ while [[ $# -gt 0 ]]; do REGISTRY="$2" shift 2 ;; + -b|--base-registry) + BASE_IMAGE_REGISTRY="$2" + shift 2 + ;; -p|--push) PUSH=true shift @@ -151,6 +157,17 @@ VERSION=$(get_version) COMMIT=$(get_commit) DATE=$(get_date) +# 解析基础镜像 +NODE_IMAGE="node:24-alpine" +GOLANG_IMAGE="golang:1.25-alpine" +ALPINE_IMAGE="alpine:3.19" +if [[ -n "$BASE_IMAGE_REGISTRY" ]]; then + BASE_IMAGE_REGISTRY="${BASE_IMAGE_REGISTRY%/}" + NODE_IMAGE="${BASE_IMAGE_REGISTRY}/library/node:24-alpine" + GOLANG_IMAGE="${BASE_IMAGE_REGISTRY}/library/golang:1.25-alpine" + ALPINE_IMAGE="${BASE_IMAGE_REGISTRY}/library/alpine:3.19" +fi + # 构建完整镜像名称 if [[ -n "$REGISTRY" ]]; then FULL_IMAGE_NAME="${REGISTRY}/${IMAGE_NAME}:${TAG}" @@ -167,6 +184,9 @@ info "镜像名称: ${FULL_IMAGE_NAME}" info "版本: ${VERSION}" info "Commit: ${COMMIT}" info "构建时间: ${DATE}" +if [[ -n "$BASE_IMAGE_REGISTRY" ]]; then + info "基础镜像仓库: ${BASE_IMAGE_REGISTRY}" +fi if [[ -n "$NO_CACHE" ]]; then info "缓存: 禁用" fi @@ -181,6 +201,9 @@ docker build \ --build-arg VERSION="${VERSION}" \ --build-arg COMMIT="${COMMIT}" \ --build-arg DATE="${DATE}" \ + --build-arg NODE_IMAGE="${NODE_IMAGE}" \ + --build-arg GOLANG_IMAGE="${GOLANG_IMAGE}" \ + --build-arg ALPINE_IMAGE="${ALPINE_IMAGE}" \ -t "${FULL_IMAGE_NAME}" \ -f Dockerfile \ .