quality / commitlint (push) Skipped
quality / changes (push) Successful in 8s
quality / openapi (push) Skipped
quality / web (push) Skipped
quality / docker-check (push) Skipped
quality / go (push) Successful in 57s
quality / bird2 (push) Successful in 15s
CD / quality (push) Successful in 1m27s
CD / publish (push) Failing after 4m13s
- Changed base image references in `docker-bake.hcl`, Dockerfiles, and `mirror-base-images.sh` from public ECR to Docker Hub to avoid 429 errors and improve reliability. - Updated README documentation to reflect the new source for base images, clarifying the mirroring process and behavior when tags already exist.
83 lines
2.7 KiB
Bash
83 lines
2.7 KiB
Bash
#!/usr/bin/env sh
|
|
# Copy-by-digest зеркало базовых образов в Gitea Container Registry (без rebuild).
|
|
# Требует: docker login в REGISTRY host, docker buildx.
|
|
# REGISTRY=git.shx.one/<owner> (без суффикса /evobgp-buildcache)
|
|
#
|
|
# Источник library-образов — Docker Hub (docker.io), не public.ecr.aws (429 Too Many Requests).
|
|
# Если тег уже есть в Gitea — skip (без повторного pull).
|
|
# Копируем только linux/amd64 — bake platforms совпадает, multi-arch индекс не нужен.
|
|
# Шаг CD не должен падать: неуспешный copy оставляет bake на Docker Hub FROM для этой базы.
|
|
set -eu
|
|
REGISTRY="${REGISTRY:?REGISTRY required (git.shx.one/<owner>)}"
|
|
CACHE_REPO="${REGISTRY}/evobgp-buildcache"
|
|
ENV_FILE="${MIRROR_ENV_FILE:-}"
|
|
PLATFORM="${MIRROR_PLATFORM:-linux/amd64}"
|
|
RETRIES="${MIRROR_RETRIES:-4}"
|
|
|
|
tmp="$(mktemp)"
|
|
cleanup() { rm -f "$tmp"; }
|
|
trap cleanup EXIT
|
|
|
|
dest_exists() {
|
|
docker buildx imagetools inspect "$1" >/dev/null 2>&1
|
|
}
|
|
|
|
copy_retry() {
|
|
src="$1"
|
|
dest="$2"
|
|
n=0
|
|
while [ "$n" -lt "$RETRIES" ]; do
|
|
n=$((n + 1))
|
|
if docker buildx imagetools create --platform "$PLATFORM" --tag "$dest" "$src"; then
|
|
return 0
|
|
fi
|
|
delay=$((n * 25))
|
|
echo "mirror retry ${n}/${RETRIES}, sleep ${delay}s: ${dest}"
|
|
sleep "$delay"
|
|
done
|
|
return 1
|
|
}
|
|
|
|
mirror() {
|
|
src="$1"
|
|
tag="$2"
|
|
var="$3"
|
|
dest="${CACHE_REPO}:${tag}"
|
|
if dest_exists "$dest"; then
|
|
echo "skip (already in registry): ${dest}"
|
|
printf '%s=%s\n' "$var" "$dest" >>"$tmp"
|
|
return 0
|
|
fi
|
|
echo "mirror ${src} -> ${dest} (${PLATFORM})"
|
|
if copy_retry "$src" "$dest"; then
|
|
printf '%s=%s\n' "$var" "$dest" >>"$tmp"
|
|
return 0
|
|
fi
|
|
echo "warn: ${dest} not mirrored — bake uses Docker Hub FROM for ${var}"
|
|
return 0
|
|
}
|
|
|
|
mirror "docker.io/library/golang:1.24-alpine" "base-golang-1.24-alpine" BASE_GOLANG
|
|
sleep 8
|
|
mirror "docker.io/library/debian:bookworm-slim" "base-debian-bookworm-slim" BASE_DEBIAN
|
|
sleep 8
|
|
mirror "docker.io/library/node:22-alpine" "base-node-22-alpine" BASE_NODE
|
|
sleep 8
|
|
mirror "docker.io/library/nginx:1.27-alpine" "base-nginx-1.27-alpine" BASE_NGINX
|
|
sleep 8
|
|
mirror "docker.io/library/ubuntu:noble" "base-ubuntu-noble" BASE_UBUNTU
|
|
sleep 8
|
|
mirror "gcr.io/distroless/static-debian12:nonroot" "base-distroless-static-debian12-nonroot" BASE_DISTROLESS
|
|
|
|
echo "----- mirrored BASE_* -----"
|
|
cat "$tmp"
|
|
if [ -n "$ENV_FILE" ]; then
|
|
env_dir="$(dirname "$ENV_FILE")"
|
|
if [ -d "$env_dir" ]; then
|
|
cp "$tmp" "$ENV_FILE"
|
|
echo "wrote ${ENV_FILE}"
|
|
else
|
|
echo "warn: MIRROR_ENV_FILE dir missing (${env_dir}) — skip write"
|
|
fi
|
|
fi
|