-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdocker_pull_new.sh
160 lines (151 loc) · 6.03 KB
/
docker_pull_new.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#!/bin/bash
# shellcheck shell=bash
# shellcheck disable=SC2086
PATH=${PATH}:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/opt/homebrew/bin
export PATH
Blue="\033[1;34m"
Green="\033[1;32m"
Red="\033[1;31m"
Yellow="\033[1;33m"
NC="\033[0m"
INFO="[${Green}INFO${NC}]"
ERROR="[${Red}ERROR${NC}]"
WARN="[${Yellow}WARN${NC}]"
function INFO() {
echo -e "${INFO} ${1}"
}
function ERROR() {
echo -e "${ERROR} ${1}"
}
function WARN() {
echo -e "${WARN} ${1}"
}
function docker_pull() {
#[ -z "${config_dir}" ] && get_config_path
start_time=$SECONDS
local config_dir=${2:-"/etc/xiaoya"}
# mirrors=("docker.io" "docker.fxxk.dedyn.io" "docker.adysec.com" "registry-docker-hub-latest-9vqc.onrender.com" "docker.chenby.cn" "dockerproxy.com" "hub.uuuadc.top" "docker.jsdelivr.fyi" "docker.registry.cyou" "dockerhub.anzu.vip")
mirrors=(
"docker.io"
"docker.chenby.cn"
"docker.nastool.de"
"hub.rat.dev"
"docker.fxxk.dedyn.io"
"docker.adysec.com"
"registry-docker-hub-latest-9vqc.onrender.com"
"docker.chenby.cn"
"dockerproxy.com"
"hub.uuuadc.top"
"docker.jsdelivr.fyi"
"docker.registry.cyou"
"dockerhub.anzu.vip"
"docker.1panel.live"
"docker.aidenxin.xyz"
"dhub.kubesre.xyz"
)
declare -A mirror_total_delays
if [ ! -f "${config_dir}/docker_mirrors.txt" ]; then
echo -e "\033[1;32m正在进行代理测速,为您选择最佳代理……\033[0m"
for i in "${!mirrors[@]}"; do
total_delay=0
success=true
for n in {1..3}; do
output=$(
curl -s -o /dev/null -w '%{time_total}' --head --request GET --connect-timeout 10 "${mirrors[$i]}"
[ $? -ne 0 ] && success=false && break
)
total_delay=$(echo "$total_delay + $output" | awk '{print $1 + $3}')
done
if $success && docker pull "${mirrors[$i]}/library/hello-world:latest" &> /dev/null; then
mirror_total_delays["${mirrors[$i]}"]=$total_delay
docker rmi "${mirrors[$i]}/library/hello-world:latest" &> /dev/null
else
break
fi
done
if [ ${#mirror_total_delays[@]} -eq 0 ]; then
#echo "docker.io" > "${config_dir}/docker_mirrors.txt"
echo -e "\033[1;31m所有代理测试失败,已恢复为官方docker镜像源,检查网络或配置可用代理后重新运行脚本,请从主菜单手动退出!\033[0m"
else
sorted_mirrors=$(for k in "${!mirror_total_delays[@]}"; do echo $k ${mirror_total_delays["$k"]}; done | sort -n -k2)
echo "$sorted_mirrors" | head -n 2 | awk '{print $1}' > "${config_dir}/docker_mirrors.txt"
echo -e "\033[1;32m已为您选取两个最佳代理点并添加到了${config_dir}/docker_mirrors.txt文件中:\033[0m"
cat ${config_dir}/docker_mirrors.txt
fi
fi
end_time=$SECONDS
execution_time=$((end_time - start_time))
echo "代码执行时间:${execution_time} 秒"
minutes=$((execution_time / 60))
seconds=$((execution_time % 60))
echo "代码执行时间:${minutes} 分 ${seconds} 秒"
mirrors=()
INFO "正在从${config_dir}/docker_mirrors.txt文件获取代理点配置……"
while IFS= read -r line; do
mirrors+=("$line")
done < "${config_dir}/docker_mirrors.txt"
if command -v timeout > /dev/null 2>&1;then
for mirror in "${mirrors[@]}"; do
INFO "正在从${mirror}代理点为您下载镜像……"
#local_sha=$(timeout 300 docker pull "${mirror}/${1}" 2>&1 | grep 'Digest: sha256' | awk -F':' '{print $3}')
[ command -v mktemp ] && tempfile=$(mktemp) || tempfile="/tmp/ailg_temp.txt"
timeout 300 docker pull "${mirror}/${1}" | tee "$tempfile"
local_sha=$(grep 'Digest: sha256' "$tempfile" | awk -F':' '{print $3}')
rm "$tempfile"
if [ -n "${local_sha}" ]; then
sed -i "\#${1}#d" "${config_dir}/ailg_sha.txt"
echo "${1} ${local_sha}" >> "${config_dir}/ailg_sha.txt"
[[ "${mirror}" == "docker.io" ]] && return 0
break
else
WARN "${1} 镜像拉取失败,正在进行重试..."
fi
done
else
for mirror in "${mirrors[@]}"; do
INFO "正在从${mirror}代理点为您下载镜像……"
timeout=200
(docker pull "${mirror}/${1}" 2>&1 | grep 'Digest: sha256' | awk -F':' '{print $3}' > "/tmp/tmp_sha") &
pid=$!
count=0
while kill -0 $pid 2>/dev/null; do
sleep 5
count=$((count+5))
if [ $count -ge $timeout ]; then
echo "Command timed out"
kill $pid
break
fi
done
local_sha=$(cat "/tmp/tmp_sha")
rm "/tmp/tmp_sha"
if [ -n "${local_sha}" ]; then
INFO "${1} 镜像拉取成功!"
#sed -i "/"${1}"/d" "${config_dir}/ailg_sha.txt"
sed -i "\#${1}#d" "${config_dir}/ailg_sha.txt"
echo "${1} ${local_sha}" >> "${config_dir}/ailg_sha.txt"
[[ "${mirror}" == "docker.io" ]] && return 0
break
else
WARN "${1} 镜像拉取失败,正在进行重试..."
fi
done
fi
if [ -n "$(docker images -q "${mirror}/${1}")" ]; then
docker tag "${mirror}/${1}" "${1}"
docker rmi "${mirror}/${1}"
return 0
else
ERROR "已尝试所有镜像代理拉取失败,程序退出,请检查网络后再试!"
exit 1
fi
}
if [ -n "$1" ];then
docker_pull $1 $2
else
while :; do
read -erp "请输入您要拉取镜像的完整名字(示例:ailg/alist:latest):" pull_img
[ -n "${pull_img}" ] && break
done
docker_pull "${pull_img}"
fi