From 3bea00aa568333a9b78ff347895a2072fedc9e25 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Tue, 28 Jul 2026 22:38:37 +0800 Subject: [PATCH] =?UTF-8?q?feat(ci):=20=E5=9F=BA=E7=A1=80=E9=95=9C?= =?UTF-8?q?=E5=83=8F=E5=88=87=E6=8D=A2=E5=88=B0=E7=A7=81=E6=9C=89ACR?= =?UTF-8?q?=EF=BC=8C=E6=9B=B4=E7=A8=B3=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Bug6(P1): 所有Dockerfile基础镜像从daocloud切到私有ACR (xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/base/) - 新增scripts/ci/sync_base_images.sh - 基础镜像同步脚本 - 覆盖: python:3.12-slim-bookworm / python:3.12-slim / node:20 / nginx:alpine --- infra/docker/api.Dockerfile | 2 +- infra/docker/ci.Dockerfile | 2 +- infra/docker/web-artifact.Dockerfile | 2 +- infra/docker/web.Dockerfile | 4 +- infra/docker/worker.Dockerfile | 2 +- scripts/ci/sync_base_images.sh | 103 +++++++++++++++++++++++++++ 6 files changed, 109 insertions(+), 6 deletions(-) create mode 100755 scripts/ci/sync_base_images.sh diff --git a/infra/docker/api.Dockerfile b/infra/docker/api.Dockerfile index 3c993295a..1fe179dde 100755 --- a/infra/docker/api.Dockerfile +++ b/infra/docker/api.Dockerfile @@ -4,7 +4,7 @@ # ============================================================ # 基础镜像:Python 3.12 -FROM docker.m.daocloud.io/library/python:3.12-slim-bookworm +FROM xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/base/python:3.12-slim-bookworm # 使用阿里云镜像加速 RUN sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || \ diff --git a/infra/docker/ci.Dockerfile b/infra/docker/ci.Dockerfile index ca384ccf8..72dc0c9f4 100644 --- a/infra/docker/ci.Dockerfile +++ b/infra/docker/ci.Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12-slim +FROM xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/base/python:3.12-slim ENV PIP_DISABLE_PIP_VERSION_CHECK=1 \ PIP_NO_CACHE_DIR=0 \ diff --git a/infra/docker/web-artifact.Dockerfile b/infra/docker/web-artifact.Dockerfile index 1ce7e4524..79dac25e6 100644 --- a/infra/docker/web-artifact.Dockerfile +++ b/infra/docker/web-artifact.Dockerfile @@ -1,4 +1,4 @@ -FROM docker.m.daocloud.io/library/nginx:alpine AS runner +FROM xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/base/nginx:alpine AS runner ARG NGINX_CONF=infra/docker/nginx.conf WORKDIR /usr/share/nginx/html COPY apps/web/dist ./ diff --git a/infra/docker/web.Dockerfile b/infra/docker/web.Dockerfile index debf6aff9..ab94f6cb1 100755 --- a/infra/docker/web.Dockerfile +++ b/infra/docker/web.Dockerfile @@ -1,5 +1,5 @@ # Build stage -FROM docker.m.daocloud.io/library/node:20 AS builder +FROM xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/base/node:20 AS builder WORKDIR /app ARG VITE_API_URL=https://saas-api.xiaoxiajianji.com ENV VITE_API_URL=$VITE_API_URL @@ -11,7 +11,7 @@ COPY apps/web/ ./ RUN npm run build # Production stage with nginx -FROM docker.m.daocloud.io/library/nginx:alpine AS runner +FROM xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/base/nginx:alpine AS runner ARG NGINX_CONF=infra/docker/nginx.conf WORKDIR /usr/share/nginx/html COPY --from=builder /app/apps/web/dist ./ diff --git a/infra/docker/worker.Dockerfile b/infra/docker/worker.Dockerfile index 66350dc03..b40a3fd66 100755 --- a/infra/docker/worker.Dockerfile +++ b/infra/docker/worker.Dockerfile @@ -4,7 +4,7 @@ # ============================================================ # 基础镜像:Python 3.12 + ffmpeg -FROM docker.m.daocloud.io/library/python:3.12-slim-bookworm +FROM xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/base/python:3.12-slim-bookworm # 使用阿里云镜像加速 RUN sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || \ diff --git a/scripts/ci/sync_base_images.sh b/scripts/ci/sync_base_images.sh new file mode 100755 index 000000000..b0f2bf072 --- /dev/null +++ b/scripts/ci/sync_base_images.sh @@ -0,0 +1,103 @@ +#!/bin/bash +# ============================================ +# 基础镜像同步脚本 - 从公共镜像源同步到私有ACR +# 用法: +# ACR_USERNAME=xxx ACR_PASSWORD=yyy bash scripts/ci/sync_base_images.sh +# ============================================ + +set -euo pipefail + +ACR_REGISTRY="${ACR_REGISTRY:-xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji}" +ACR_USERNAME="${ACR_USERNAME:-}" +ACR_PASSWORD="${ACR_PASSWORD:-}" +SOURCE_PREFIX="${SOURCE_PREFIX:-docker.m.daocloud.io/library}" + +# 需要同步的镜像列表 (源镜像名:tag => ACR目标名:tag) +IMAGES=( + "python:3.12-slim-bookworm" + "python:3.12-slim" + "node:20" + "nginx:alpine" +) + +echo "============================================" +echo " 基础镜像同步到 ACR" +echo " ACR: $ACR_REGISTRY" +echo " 源: $SOURCE_PREFIX" +echo "============================================" +echo "" + +# 登录 ACR +if [ -n "$ACR_PASSWORD" ] && [ -n "$ACR_USERNAME" ]; then + echo "登录 ACR..." + ACR_HOST=$(echo "$ACR_REGISTRY" | cut -d/ -f1) + printf '%s' "$ACR_PASSWORD" | docker login "$ACR_HOST" -u "$ACR_USERNAME" --password-stdin + echo "ACR 登录成功" + echo "" +fi + +success=0 +failed=0 + +for image in "${IMAGES[@]}"; do + source_image="${SOURCE_PREFIX}/${image}" + target_image="${ACR_REGISTRY}/base/${image}" + + echo "--- 同步: $image ---" + echo " 源: $source_image" + echo " 目标: $target_image" + + # Pull 源镜像(带重试) + pulled=0 + for attempt in 1 2 3; do + echo " Pull 尝试 $attempt/3..." + if docker pull "$source_image"; then + pulled=1 + break + fi + echo " Pull 失败,5s 后重试..." + sleep 5 + done + + if [ "$pulled" -eq 0 ]; then + echo " ❌ Pull 失败: $image" + failed=$((failed + 1)) + continue + fi + + # Tag + docker tag "$source_image" "$target_image" + echo " Tag 完成" + + # Push 到 ACR + pushed=0 + for attempt in 1 2 3; do + echo " Push 尝试 $attempt/3..." + if docker push "$target_image"; then + pushed=1 + break + fi + echo " Push 失败,5s 后重试..." + sleep 5 + done + + if [ "$pushed" -eq 1 ]; then + echo " ✅ 同步成功: $image" + success=$((success + 1)) + else + echo " ❌ Push 失败: $image" + failed=$((failed + 1)) + fi + + echo "" +done + +echo "============================================" +echo " 同步完成" +echo " 成功: $success" +echo " 失败: $failed" +echo "============================================" + +if [ "$failed" -gt 0 ]; then + exit 1 +fi