diff --git a/.github/workflows/manual-deep-sync.yml b/.github/workflows/manual-deep-sync.yml
index f40cda5..74601cd 100644
--- a/.github/workflows/manual-deep-sync.yml
+++ b/.github/workflows/manual-deep-sync.yml
@@ -16,7 +16,7 @@ jobs:
steps:
- name: Set up crproxy
run: |
- wget https://github.com/DaoCloud/crproxy/releases/download/v0.13.0-alpha.43/crproxy_linux_amd64 -O /usr/local/bin/crproxy && chmod +x /usr/local/bin/crproxy
+ wget https://github.com/DaoCloud/crproxy/releases/download/v0.13.0-alpha.154/crproxy_linux_amd64 -O /usr/local/bin/crproxy && chmod +x /usr/local/bin/crproxy
- name: Sync Images to OSS&OBS
run: |
diff --git a/.github/workflows/manual-sync.yml b/.github/workflows/manual-sync.yml
index e287c28..3739715 100644
--- a/.github/workflows/manual-sync.yml
+++ b/.github/workflows/manual-sync.yml
@@ -16,7 +16,7 @@ jobs:
steps:
- name: Set up crproxy
run: |
- wget https://github.com/DaoCloud/crproxy/releases/download/v0.13.0-alpha.43/crproxy_linux_amd64 -O /usr/local/bin/crproxy && chmod +x /usr/local/bin/crproxy
+ wget https://github.com/DaoCloud/crproxy/releases/download/v0.13.0-alpha.154/crproxy_linux_amd64 -O /usr/local/bin/crproxy && chmod +x /usr/local/bin/crproxy
- name: Sync Images to OSS&OBS
run: |
diff --git a/.github/workflows/sync-image.yml b/.github/workflows/sync-image.yml
index 837010b..840b158 100644
--- a/.github/workflows/sync-image.yml
+++ b/.github/workflows/sync-image.yml
@@ -28,6 +28,7 @@ jobs:
CORRECT_IMAGE="$(./hack/correct-image.sh "${ORIGIN_IMAGE}")"
if [[ "${CORRECT_IMAGE}" == "" ]]; then
gh issue comment ${{ github.event.issue.number }} -b "镜像 '${ORIGIN_IMAGE}' 不是一个镜像"
+ gh issue close ${{ github.event.issue.number }} --reason "not planned"
exit 1
fi
if [[ "${CORRECT_IMAGE}" != "${ORIGIN_IMAGE}" ]]; then
@@ -36,39 +37,64 @@ jobs:
else
gh issue comment ${{ github.event.issue.number }} -b "镜像 '${ORIGIN_IMAGE}' 不存在呢, 也许应该是 '${CORRECT_IMAGE}'"
fi
+ gh issue close ${{ github.event.issue.number }} --reason "not planned"
exit 1
fi
if ! ./hack/verify-allows.sh ./allows.txt "${ORIGIN_IMAGE}"; then
gh issue comment ${{ github.event.issue.number }} -b "镜像 ${ORIGIN_IMAGE} 不在白名单列表里, 不支持同步和访问
可以将其添加到[白名单](https://github.com/${{ github.repository }}/issues/2328)"
+ gh issue close ${{ github.event.issue.number }} --reason "not planned"
exit 1
fi
echo "image=${ORIGIN_IMAGE}" >> $GITHUB_OUTPUT
- - name: Check Image
- run: |
- ORIGIN_IMAGE="${{ steps.get-image.outputs.image }}"
- gh issue comment ${{ github.event.issue.number }} -b "镜像 ${ORIGIN_IMAGE} 同步中...
[详情请查看](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})"
+ SYNC_IMAGE="$(./hack/real-image.sh "${ORIGIN_IMAGE}")"
+ echo "sync_image=${SYNC_IMAGE}" >> $GITHUB_OUTPUT
- name: Set up crproxy
run: |
- wget https://github.com/DaoCloud/crproxy/releases/download/v0.13.0-alpha.43/crproxy_linux_amd64 -O /usr/local/bin/crproxy && chmod +x /usr/local/bin/crproxy
+ wget https://github.com/DaoCloud/crproxy/releases/download/v0.13.0-alpha.154/crproxy_linux_amd64 -O /usr/local/bin/crproxy && chmod +x /usr/local/bin/crproxy
- - name: Sync Images to OSS&OBS
+ - name: Create message to queue
+ id: get-message
+ run: |
+ MESSAGE_ID=$(curl -X 'PUT' \
+ 'https://queue.m.daocloud.io/apis/v1/messages' \
+ -H 'Authorization: Bearer ${{ secrets.QUEUE_TOKEN }}' \
+ -H 'Content-Type: application/json' \
+ -d '{
+ "content": "${{ steps.get-image.outputs.sync_image }}",
+ "priority": 10
+ }' | jq -r .id)
+
+ echo "message_id=${MESSAGE_ID}" >> $GITHUB_OUTPUT
+
+ - name: Sync Status
run: |
ORIGIN_IMAGE="${{ steps.get-image.outputs.image }}"
- /usr/local/bin/crproxy sync --deep --max-warn 1 ${{ secrets.STORAGE_ARGS }} --user '${{ secrets.OCI_USER }}' --list ${ORIGIN_IMAGE}
+ gh issue comment ${{ github.event.issue.number }} -b "镜像 ${ORIGIN_IMAGE} 添加到同步队列...
[同步队列](https://queue.m.daocloud.io/status/)
[详细信息](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})"
- - name: Succeeded Sync
+ - name: Sync Runner
run: |
- ORIGIN_IMAGE="${{ steps.get-image.outputs.image }}"
- gh issue comment ${{ github.event.issue.number }} -b "镜像 ${ORIGIN_IMAGE} 同步完成
请使用 m.daocloud.io/${ORIGIN_IMAGE} 替代源镜像"
- gh issue edit ${{ github.event.issue.number }} --add-label "sync image succeeded" -b "IMAGE SYNC"
- gh issue close ${{ github.event.issue.number }} --reason "completed"
+ (
+ ORIGIN_IMAGE="${{ steps.get-image.outputs.image }}"
+ last_json="$(curl -X GET 'https://queue.m.daocloud.io/apis/v1/messages/${{ steps.get-message.outputs.message_id }}?watch=true' | jq -n 'reduce inputs as $item (null; $item)')"
+ status_code=$(echo "$last_json" | jq -r .status)
+ if [[ $status_code -eq 20 ]]; then
+ gh issue comment ${{ github.event.issue.number }} -b "镜像 ${ORIGIN_IMAGE} 同步完成
请使用 m.daocloud.io/${ORIGIN_IMAGE} 替代源镜像"
+ gh issue edit ${{ github.event.issue.number }} --add-label "sync image succeeded" -b "IMAGE SYNC"
+ gh issue close ${{ github.event.issue.number }} --reason "completed"
+ elif [[ $status_code -eq 30 ]]; then
+ error_message=$(echo "$last_json" | jq -r .data.error)
+ gh issue comment ${{ github.event.issue.number }} -b "镜像 ${ORIGIN_IMAGE} 同步失败
${error_message}"
+ gh issue edit ${{ github.event.issue.number }} --add-label "sync image failure" -b "IMAGE SYNC"
+ gh issue close ${{ github.event.issue.number }} --reason "not planned"
+ else
+ gh issue comment ${{ github.event.issue.number }} -b "镜像 ${ORIGIN_IMAGE} 同步异常
[详情请查看](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})"
+ gh issue edit ${{ github.event.issue.number }} --add-label "sync image failure" -b "IMAGE SYNC"
+ gh issue close ${{ github.event.issue.number }} --reason "not planned"
+ fi
+ ) &
+
+ /usr/local/bin/crproxy cluster runner ${{ secrets.STORAGE_ARGS }} --user '${{ secrets.OCI_USER }}' --queue-token '${{ secrets.QUEUE_TOKEN }}' --queue-url https://queue.m.daocloud.io/apis/v1 --duration 10s --retry=3 --retry-interval=2s &
- - name: Fail Sync
- if: failure()
- run: |
- ORIGIN_IMAGE="${{ steps.get-image.outputs.image }}"
- gh issue comment ${{ github.event.issue.number }} -b "镜像 ${ORIGIN_IMAGE} 同步失败[详情请查看](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})
如有疑问请回复 /auto-cc 召唤帮助, 或者查看[同步成功案例](https://github.com/${{ github.repository }}/issues?q=is%3Aissue+is%3Aclosed+label%3A%22sync+image+succeeded%22)或[白名单申请案例](https://github.com/${{ github.repository }}/issues?q=is%3Aissue+label%3A%22allows+image%22+is%3Aclosed+linked%3Apr)"
- gh issue edit ${{ github.event.issue.number }} --add-label "sync image failure" -b "IMAGE SYNC"
- gh issue close ${{ github.event.issue.number }} --reason "not planned"
+ wait
diff --git a/.github/workflows/sync-runner.yml b/.github/workflows/sync-runner.yml
new file mode 100644
index 0000000..5c6524d
--- /dev/null
+++ b/.github/workflows/sync-runner.yml
@@ -0,0 +1,20 @@
+name: Sync Runner
+
+on:
+ schedule:
+ - cron: "*/10 * * * *"
+
+ workflow_dispatch:
+
+jobs:
+ sync-images:
+ runs-on: ubuntu-latest
+ if: github.repository == 'DaoCloud/public-image-mirror'
+ steps:
+ - name: Set up crproxy
+ run: |
+ wget https://github.com/DaoCloud/crproxy/releases/download/v0.13.0-alpha.154/crproxy_linux_amd64 -O /usr/local/bin/crproxy && chmod +x /usr/local/bin/crproxy
+
+ - name: Sync Runner
+ run: |
+ /usr/local/bin/crproxy cluster runner ${{ secrets.STORAGE_ARGS }} --user '${{ secrets.OCI_USER }}' --queue-token '${{ secrets.QUEUE_TOKEN }}' --queue-url https://queue.m.daocloud.io/apis/v1 --duration 1h --retry=3 --retry-interval=2s
diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml
index 41e6174..cdd1c52 100644
--- a/.github/workflows/sync.yml
+++ b/.github/workflows/sync.yml
@@ -2,7 +2,7 @@ name: Sync
on:
schedule:
- - cron: "1 16 * * *"
+ - cron: "1 * * * *"
workflow_dispatch:
@@ -16,9 +16,12 @@ jobs:
- name: Set up crproxy
run: |
- wget https://github.com/DaoCloud/crproxy/releases/download/v0.13.0-alpha.43/crproxy_linux_amd64 -O /usr/local/bin/crproxy && chmod +x /usr/local/bin/crproxy
+ wget https://github.com/DaoCloud/crproxy/releases/download/v0.13.0-alpha.154/crproxy_linux_amd64 -O /usr/local/bin/crproxy && chmod +x /usr/local/bin/crproxy
- name: Sync Images to OSS&OBS
run: |
- ORIGIN_IMAGE=$(echo "${MESSAGE}" | grep SYNC | awk '{print $2}' | head -n 1 | sed "s/\r//g")
- /usr/local/bin/crproxy sync --max-warn 100 ${{ secrets.STORAGE_ARGS }} --list-from-file ./mirror.txt
+ /usr/local/bin/crproxy sync --max-warn 100 ${{ secrets.STORAGE_ARGS }} --user '${{ secrets.OCI_USER }}' --list-from-file ./mirror.txt
+
+ - name: Quick Sync Images to OSS&OBS
+ run: |
+ /usr/local/bin/crproxy sync --max-warn 10 ${{ secrets.STORAGE_ARGS }} --user '${{ secrets.OCI_USER }}' --list-from-file ./mirror-quick.txt --quick
diff --git a/.github/workflows/update-allows-list.yml b/.github/workflows/update-allows-list.yml
index ab6ada6..f7c3121 100644
--- a/.github/workflows/update-allows-list.yml
+++ b/.github/workflows/update-allows-list.yml
@@ -18,7 +18,7 @@ jobs:
- name: Update list
run: |
- LIST="$(cat ./allows.txt | jq -R -s -c '{"items": split("\n")[:-1], "block_message": "🚫 👀-> https://github.com/DaoCloud/public-image-mirror/issues/2328 🔗 这镜像不在白名单. this image is not in the allowlist."}')"
+ LIST="$(cat ./allows.txt | grep -v 'docker.io/\*' | sed 's/docker.io\/library\/\([^\/]*\)/&\ndocker.io\/\1/' | jq -R -s -c '{"items": split("\n")[:-1], "block_message": "🚫 👀-> https://github.com/DaoCloud/public-image-mirror/issues/2328 🔗 这镜像不在白名单. this image is not in the allowlist."}')"
TOKEN="$(curl -X 'POST' \
'https://auth.m.daocloud.io/apis/v1/users/login' \
-H 'Accept: application/json' \
diff --git a/allows.txt b/allows.txt
index 1055999..42c56fc 100644
--- a/allows.txt
+++ b/allows.txt
@@ -54,7 +54,7 @@ docker.io/benzino77/clamav-rest-api
docker.io/binhex/arch-jellyfin
docker.io/binwiederhier/ntfy
docker.io/bitnami/*
-docker.io/bitnamicharts/kibana
+docker.io/bitnamicharts/*
docker.io/budibase/budibase
docker.io/budtmo/docker-android
docker.io/bvlc/caffe
@@ -88,10 +88,13 @@ docker.io/coredns/*
docker.io/cp2k/cp2k
docker.io/csiplugin/*
docker.io/curlimages/*
+docker.io/cvat/server
+docker.io/cvat/ui
docker.io/dadoum/anisette-v3-server
docker.io/danielqsj/kafka-exporter
docker.io/daprio/*
docker.io/darthsim/imgproxy
+docker.io/datastax/*
docker.io/debezium/*
docker.io/deepflowce/*
docker.io/deluan/navidrome
@@ -117,11 +120,13 @@ docker.io/dragonflyoss/trainer
docker.io/drakkan/sftpgo
docker.io/dremio/dremio-oss
docker.io/drone/drone
+docker.io/drone/drone-runner-docker
docker.io/drumsergio/genieacs
docker.io/dustynv/*
docker.io/dxflrs/*
docker.io/e2bdev/code-interpreter
docker.io/elastic/*
+docker.io/electronuserland/builder
docker.io/elsaworkflows/*
docker.io/emby/*
docker.io/emqx/*
@@ -154,6 +159,7 @@ docker.io/frappe/*
docker.io/frooodle/s-pdf
docker.io/frrouting/*
docker.io/funcman/115pc
+docker.io/gaecfovdocker/pulsar-console
docker.io/geoservercloud/*
docker.io/gerritcodereview/gerrit
docker.io/getmeili/*
@@ -291,6 +297,7 @@ docker.io/library/chronograf
docker.io/library/cirros
docker.io/library/clearlinux
docker.io/library/clefos
+docker.io/library/clickhouse
docker.io/library/clojure
docker.io/library/composer
docker.io/library/consul
@@ -443,6 +450,8 @@ docker.io/metacontrollerio/metacontroller
docker.io/milvusdb/*
docker.io/mindsdb/mindsdb
docker.io/minio/*
+docker.io/mintplexlabs/anythingllm
+docker.io/mirantis/*
docker.io/mitmproxy/mitmproxy
docker.io/moby/*
docker.io/mohsinonxrm/*
@@ -535,6 +544,7 @@ docker.io/qdtoday/qd
docker.io/qemux/qemu-docker
docker.io/qingpan/rnacos
docker.io/qmcgaw/ddns-updater
+docker.io/questdb/questdb
docker.io/quickwit/*
docker.io/radondb/*
docker.io/ramonvc/freegpt-webui
@@ -575,6 +585,7 @@ docker.io/semitechnologies/*
docker.io/senthilrch/*
docker.io/serengil/deepface
docker.io/sickcodes/docker-osx
+docker.io/sj26/mailcatcher
docker.io/snowdreamtech/frpc
docker.io/snowdreamtech/frps
docker.io/solace/solace-pubsub-standard
@@ -722,7 +733,9 @@ ghcr.io/helm/**
ghcr.io/home-assistant/**
ghcr.io/huggingface/*
ghcr.io/hwameistor/**
+ghcr.io/imagegenius/immich
ghcr.io/immich-app/**
+ghcr.io/infrastructure-io/**
ghcr.io/jd-opensource/**
ghcr.io/jimmidyson/configmap-reload
ghcr.io/joeferner/redis-commander
diff --git a/hack/real-image.sh b/hack/real-image.sh
new file mode 100755
index 0000000..eb5601d
--- /dev/null
+++ b/hack/real-image.sh
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+
+function guess_image() {
+ local image="${1}"
+
+ if [[ -z "${image}" ]]; then
+ return
+ fi
+
+ if [[ "${image}" =~ ^"docker.io/"* ]]; then
+ image="registry-1.${image}"
+ fi
+
+ if [[ "${image}" =~ ^"registry-1.docker.io/"[^/]+$ ]]; then
+ image="registry-1.docker.io/library/${image#*/}"
+ fi
+
+ echo "${image}"
+}
+
+guess_image "${1}"
diff --git a/hack/verify-allows.sh b/hack/verify-allows.sh
index e38dfd9..38f337f 100755
--- a/hack/verify-allows.sh
+++ b/hack/verify-allows.sh
@@ -7,6 +7,9 @@ image=$2
function check_allows() {
local file=$1
local image=$2
+ if [[ "${image}" == *":" ]]; then
+ return 1
+ fi
while read line; do
if [[ "${line}" == *"**" ]]; then
if [[ "${image}" == "${line%\*\*}"* ]]; then
diff --git a/mirror-quick.txt b/mirror-quick.txt
new file mode 100644
index 0000000..29c9c85
--- /dev/null
+++ b/mirror-quick.txt
@@ -0,0 +1,180 @@
+docker.io/kindest/node:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/adminer:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/aerospike:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/almalinux:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/alpine:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/alt:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/amazoncorretto:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/amazonlinux:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/api-firewall:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/arangodb:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/archlinux:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/backdrop:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/bash:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/bonita:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/buildpack-deps:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/busybox:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/caddy:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/cassandra:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/centos:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/chronograf:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/cirros:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/clearlinux:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/clefos:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/clickhouse:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/clojure:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/composer:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/consul:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/convertigo:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/couchbase:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/couchdb:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/crate:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/dart:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/debian:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/docker:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/drupal:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/eclipse-mosquitto:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/eclipse-temurin:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/eggdrop:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/elasticsearch:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/elixir:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/emqx:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/erlang:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/fedora:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/flink:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/fluentd:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/friendica:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/gazebo:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/gcc:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/geonetwork:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/ghost:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/golang:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/gradle:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/groovy:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/haproxy:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/haskell:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/haxe:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/hello-world:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/hitch:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/httpd:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/hylang:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/ibm-semeru-runtimes:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/ibmjava:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/influxdb:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/irssi:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/java:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/jetty:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/joomla:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/jruby:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/julia:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/kapacitor:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/kibana:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/kong:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/lightstreamer:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/liquibase:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/logstash:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/mageia:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/mariadb:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/matomo:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/maven:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/mediawiki:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/memcached:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/mongo-express:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/mongo:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/monica:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/mono:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/mysql:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/nats-streaming:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/nats:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/neo4j:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/neurodebian:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/nextcloud:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/nginx:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/node:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/notary:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/odoo:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/open-liberty:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/openjdk:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/oraclelinux:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/orientdb:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/owncloud:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/percona:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/perl:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/photon:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/php-zendserver:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/php:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/phpmyadmin:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/plone:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/postfixadmin:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/postgres:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/pypy:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/python:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/r-base:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/rabbitmq:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/rakudo-star:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/redis:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/redmine:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/registry:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/rethinkdb:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/rocket.chat:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/rockylinux:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/ros:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/ruby:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/rust:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/sapmachine:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/satosa:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/sentry:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/silverpeas:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/solr:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/sonarqube:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/spark:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/spiped:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/storm:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/swift:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/swipl:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/teamspeak:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/telegraf:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/tomcat:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/tomee:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/traefik:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/ubuntu:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/unit:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/varnish:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/websphere-liberty:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/wordpress:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/xwiki:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/yourls:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/znc:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/zookeeper:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/nvidia/cuda:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/ollama/ollama:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/prom/prometheus:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/pytorch/pytorch:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/rancher/rancher-agent:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/rancher/rancher:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/busybox:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/coredns/coredns:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/coredns:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/debian-base:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/echoserver:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/etcd:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/kube-apiserver:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/kube-controller-manager:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/kube-proxy:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/kube-scheduler:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/kube-state-metrics/kube-state-metrics:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/kubectl:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/kueue/kueue:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/kwok/cluster:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/kwok/kwok:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/metrics-server/metrics-server:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/nfd/node-feature-discovery:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/nginx-slim:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/nginx:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/node-problem-detector:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/pause:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/prometheus-adapter/prometheus-adapter:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/scheduler-plugins/controller:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/scheduler-plugins/kube-scheduler:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/serve_hostname:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+registry.k8s.io/test-webserver:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
diff --git a/mirror.txt b/mirror.txt
index d39818d..77d4cb0 100644
--- a/mirror.txt
+++ b/mirror.txt
@@ -1,119 +1,136 @@
-docker.io/kindest/node:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/adminer:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/alpine:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/amazoncorretto:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/arangodb:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/archlinux:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/bash:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/buildpack-deps:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/busybox:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/caddy:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/cassandra:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/centos:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/chronograf:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/composer:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/consul:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/couchbase:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/couchdb:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/debian:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/docker:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/eclipse-mosquitto:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/eclipse-temurin:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/elasticsearch:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/emqx:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/fedora:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/flink:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/friendica:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/gcc:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/ghost:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/golang:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/gradle:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/groovy:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/haproxy:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/haskell:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/hello-world:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/httpd:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/ibm-semeru-runtimes:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/influxdb:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/java:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/jetty:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/kibana:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/kong:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/logstash:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/mariadb:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/matomo:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/maven:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/mediawiki:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/memcached:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/mongo-express:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/mongo:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/mysql:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/nats-streaming:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/nats:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/neo4j:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/nextcloud:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/nginx:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/node:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/odoo:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/openjdk:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/owncloud:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/percona:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/perl:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/php:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/phpmyadmin:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/postgres:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/python:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/r-base:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/rabbitmq:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/redis:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/registry:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/rethinkdb:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/rockylinux:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/ros:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/ruby:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/rust:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/sentry:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/solr:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/sonarqube:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/spark:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/teamspeak:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/telegraf:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/tomcat:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/traefik:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/ubuntu:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/varnish:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/wordpress:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/yourls:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/library/zookeeper:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/nvidia/cuda:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/ollama/ollama:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/prom/prometheus:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/pytorch/pytorch:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/rancher/rancher-agent:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-docker.io/rancher/rancher:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/busybox:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/coredns/coredns:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/coredns:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/debian-base:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/echoserver:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/etcd:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/kube-apiserver:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/kube-controller-manager:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/kube-proxy:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/kube-scheduler:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/kube-state-metrics/kube-state-metrics:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/kubectl:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/kueue/kueue:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/kwok/cluster:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/kwok/kwok:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/metrics-server/metrics-server:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/nfd/node-feature-discovery:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/nginx-slim:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/nginx:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/node-problem-detector:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/pause:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/prometheus-adapter/prometheus-adapter:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/scheduler-plugins/controller:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/scheduler-plugins/kube-scheduler:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/serve_hostname:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
-registry.k8s.io/test-webserver:^([a-z]+-)?[a-z]*[0-9]+(\.[0-9]+){1,2}$
+docker.io/library/adminer:latest
+docker.io/library/almalinux:latest
+docker.io/library/alpine:latest
+docker.io/library/alt:latest
+docker.io/library/amazoncorretto:latest
+docker.io/library/amazonlinux:latest
+docker.io/library/api-firewall:latest
+docker.io/library/arangodb:latest
+docker.io/library/archlinux:latest
+docker.io/library/backdrop:latest
+docker.io/library/bash:latest
+docker.io/library/bonita:latest
+docker.io/library/buildpack-deps:latest
+docker.io/library/busybox:latest
+docker.io/library/caddy:latest
+docker.io/library/cassandra:latest
+docker.io/library/centos:latest
+docker.io/library/chronograf:latest
+docker.io/library/cirros:latest
+docker.io/library/clearlinux:latest
+docker.io/library/clefos:latest
+docker.io/library/clickhouse:latest
+docker.io/library/clojure:latest
+docker.io/library/composer:latest
+docker.io/library/convertigo:latest
+docker.io/library/couchbase:latest
+docker.io/library/couchdb:latest
+docker.io/library/crate:latest
+docker.io/library/debian:latest
+docker.io/library/docker:latest
+docker.io/library/drupal:latest
+docker.io/library/eclipse-mosquitto:latest
+docker.io/library/eclipse-temurin:latest
+docker.io/library/eggdrop:latest
+docker.io/library/elixir:latest
+docker.io/library/emqx:latest
+docker.io/library/erlang:latest
+docker.io/library/fedora:latest
+docker.io/library/flink:latest
+docker.io/library/fluentd:latest
+docker.io/library/friendica:latest
+docker.io/library/gazebo:latest
+docker.io/library/gcc:latest
+docker.io/library/geonetwork:latest
+docker.io/library/ghost:latest
+docker.io/library/golang:latest
+docker.io/library/gradle:latest
+docker.io/library/groovy:latest
+docker.io/library/haproxy:latest
+docker.io/library/haskell:latest
+docker.io/library/haxe:latest
+docker.io/library/hello-world:latest
+docker.io/library/hitch:latest
+docker.io/library/httpd:latest
+docker.io/library/hylang:latest
+docker.io/library/ibmjava:latest
+docker.io/library/influxdb:latest
+docker.io/library/irssi:latest
+docker.io/library/jetty:latest
+docker.io/library/joomla:latest
+docker.io/library/jruby:latest
+docker.io/library/julia:latest
+docker.io/library/kapacitor:latest
+docker.io/library/kong:latest
+docker.io/library/lightstreamer:latest
+docker.io/library/liquibase:latest
+docker.io/library/mageia:latest
+docker.io/library/mariadb:latest
+docker.io/library/matomo:latest
+docker.io/library/maven:latest
+docker.io/library/mediawiki:latest
+docker.io/library/memcached:latest
+docker.io/library/mongo-express:latest
+docker.io/library/mongo:latest
+docker.io/library/monica:latest
+docker.io/library/mono:latest
+docker.io/library/mysql:latest
+docker.io/library/nats-streaming:latest
+docker.io/library/nats:latest
+docker.io/library/neo4j:latest
+docker.io/library/neurodebian:latest
+docker.io/library/nextcloud:latest
+docker.io/library/nginx:latest
+docker.io/library/node:latest
+docker.io/library/odoo:latest
+docker.io/library/open-liberty:latest
+docker.io/library/openjdk:latest
+docker.io/library/orientdb:latest
+docker.io/library/owncloud:latest
+docker.io/library/percona:latest
+docker.io/library/perl:latest
+docker.io/library/photon:latest
+docker.io/library/php-zendserver:latest
+docker.io/library/php:latest
+docker.io/library/phpmyadmin:latest
+docker.io/library/plone:latest
+docker.io/library/postfixadmin:latest
+docker.io/library/postgres:latest
+docker.io/library/pypy:latest
+docker.io/library/python:latest
+docker.io/library/r-base:latest
+docker.io/library/rabbitmq:latest
+docker.io/library/rakudo-star:latest
+docker.io/library/redis:latest
+docker.io/library/redmine:latest
+docker.io/library/registry:latest
+docker.io/library/rethinkdb:latest
+docker.io/library/rocket.chat:latest
+docker.io/library/ros:latest
+docker.io/library/ruby:latest
+docker.io/library/rust:latest
+docker.io/library/sapmachine:latest
+docker.io/library/satosa:latest
+docker.io/library/sentry:latest
+docker.io/library/silverpeas:latest
+docker.io/library/solr:latest
+docker.io/library/sonarqube:latest
+docker.io/library/spark:latest
+docker.io/library/spiped:latest
+docker.io/library/storm:latest
+docker.io/library/swift:latest
+docker.io/library/swipl:latest
+docker.io/library/teamspeak:latest
+docker.io/library/telegraf:latest
+docker.io/library/tomcat:latest
+docker.io/library/tomee:latest
+docker.io/library/traefik:latest
+docker.io/library/ubuntu:latest
+docker.io/library/unit:latest
+docker.io/library/varnish:latest
+docker.io/library/websphere-liberty:latest
+docker.io/library/wordpress:latest
+docker.io/library/xwiki:latest
+docker.io/library/yourls:latest
+docker.io/library/znc:latest
+docker.io/library/zookeeper:latest