导出docker镜像save_docker_images.sh,脚本内容如下:
脚本需要两个参数,第一个参数是导出的tar包所在的目录(必传),第二个参数是要导出的包,支持模糊查询(非必传)例如:./save_all_docker_images.sh /tmp/docker_save mysql
bash
#!/bin/bash
# 参数校验
if [ -z "$1" ]; then
echo "Usage: $0 <export_dir> [filter_pattern]"
exit 1
fi
export_dir="$1"
filter_pattern="${2:-.*}" # 默认匹配所有
# 创建目录
mkdir -p "$export_dir" || {
echo "无法创建目录: $export_dir"
exit 1
}
# 导出镜像
# docker images --format "table {{.Repository}}\t{{.Tag}}" |
docker images --format '{{.Repository}}\t{{.Tag}}' | \
awk -v filter="$filter_pattern" '
BEGIN {FS="\t"}
NR>1 && $1 ~ filter || $2 ~ filter {
print $1":"$2
}
' | while read -r image; do
echo $image
repo=$(echo "$image" | cut -d: -f1 | tr '/' '_')
tag=$(echo "$image" | cut -d: -f2 | tr '/' '_')
file="$export_dir/${repo}_${tag}.tar"
if [ -f "$file" ]; then
echo "跳过已存在镜像: $image"
continue
fi
echo "导出镜像: $image"
docker save -o "$file" "$image"
echo "成功导出镜像: $image"
done
echo "导出完成,保存路径: $export_dir"
导入docker镜像import_docker_images.sh,脚本内容如下:
脚本需要导出的tar包所在的目录作为参数,例如:./docker_import.sh /tmp/docker_save
bash
#!/bin/bash
# 参数校验
if [ -z "$1" ]; then
echo "Usage: $0 <import_dir>"
exit 1
fi
import_dir="$1"
# 遍历镜像文件
find "$import_dir" -maxdepth 1 -name "*.tar" | while read -r file; do
# 解析文件名
filename=$(basename "$file")
repo_tag=${filename%.tar}
repo=$(echo "$repo_tag" | cut -d'_' -f1 | tr '_' '/')
tag=$(echo "$repo_tag" | cut -d'_' -f2-)
# 检查镜像是否存在
# if docker images -q "$repo:$tag" >/dev/null 2>&1; then
if [ -n "$(docker images -q $repo:$tag 2>/dev/null)" ]; then
echo "跳过已存在镜像: $repo:$tag"
continue
fi
echo "导入镜像: $repo:$tag"
docker load -i "$file"
echo "导入镜像成功: $repo:$tag"
done
echo "导入完成"