1. 快速导入镜像
对于离线部署环境可使用此脚本从本机快速复制脚本至部署机器,支持多镜像多机器同时导入,需要本机装有 docker
、openssh-client
和 scp
软件包。此脚本只支持 Containerd
。
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
#!/usr/bin/env bash
if [ ! "$1" ] || [ ! "$2" ]; then
echo "help"
echo ""
echo "send-image root@<ip>,root@<ip> image1,image2,res.yaml,res.yml"
echo ""
echo "Example: send-image root@10.0.0.1,root@10.0.0.2 busybox,nginx"
exit 1
fi
# 取配置
IFS=',' read -r -a REMOTES <<<"$1"
IFS=',' read -r -a IMAGE_SOURCES <<<"$2"
FILES=()
IMAGES=()
for IMAGE_SOURCE in ${IMAGE_SOURCES[*]}; do
# shellcheck disable=SC2086
if [ -f $IMAGE_SOURCE ] && [[ $IMAGE_SOURCE =~ ^.*(yaml|yml)$ ]]; then
# shellcheck disable=SC2002
# shellcheck disable=SC2207
IMAGES+=($(cat "$IMAGE_SOURCE" | grep "image:" | sed "s/image://g" | xargs echo))
else
# shellcheck disable=SC2206
IMAGES+=($IMAGE_SOURCE)
fi
done
for IMAGE_NAME in ${IMAGES[*]}; do
SAVE_IMG_NAME=$(echo "$IMAGE_NAME" | sed -e s@/@-@g -e s/@/-/g -e "s/:/-/g")
if [ "$DEBUG" ]; then
podman pull "$IMAGE_NAME" || exit 1
else
podman pull "$IMAGE_NAME" 1>/dev/null || exit 1
fi
if [ ! -f /tmp/"$SAVE_IMG_NAME" ]; then
podman save -o /tmp/"$SAVE_IMG_NAME" "$IMAGE_NAME" 1>/dev/null
fi
# shellcheck disable=SC2179
FILES+=("/tmp/$SAVE_IMG_NAME")
done
SCRIPT_PATH=/tmp/import-script-"$USER"
rm -f "$SCRIPT_PATH" 1>/dev/null || :
echo "#!/bin/bash" >"$SCRIPT_PATH"
for LOCAL_FILE in ${FILES[*]}; do
# shellcheck disable=SC2129
echo "ctr -n=k8s.io image import $LOCAL_FILE 2>/dev/null ||:" >>"$SCRIPT_PATH" ||
echo "docker -n=k8s.io load --input $LOCAL_FILE 2>/dev/null ||: " >>"$SCRIPT_PATH" || exit 1
echo "/bin/rm -f $LOCAL_FILE" >>"$SCRIPT_PATH"
done
for REMOTE_ADDRESS in ${REMOTES[*]}; do
# shellcheck disable=SC2086
if [ $DEBUG ]; then
scp "$SCRIPT_PATH" ${FILES[*]} "$REMOTE_ADDRESS":/tmp/
# shellcheck disable=SC2029
ssh "$REMOTE_ADDRESS" "bash $SCRIPT_PATH"
else
scp $SCRIPT_PATH ${FILES[*]} "$REMOTE_ADDRESS":/tmp/ 1>/dev/null
# shellcheck disable=SC2029
ssh "$REMOTE_ADDRESS" "bash $SCRIPT_PATH" 1>/dev/null
fi
done
/bin/rm ${FILES[*]}