最近好多docker镜像站都不能访问和使用了,所以想着把已有的镜像进行批量导出,免得到时候找不到可用镜像源导致无法使用docker拉取镜像。
根据需求编写脚本如下:
IMAGES=("nginx:latest" "redis:alpine")
for image in "${IMAGES[@]}"; do
docker save $image | gzip > "${image%%:*}_$(date +%Y%m%d).tar.gz"
done
使用这个方式导出一般镜像是可以的,但是当遇到又/的就不行了
hub.zentao.net/app/zentao latest 3919e3f2b921 5 days ago 606MB
rabbitmq latest abf34a9fef62 6 days ago 237MB
golang latest 29616a01ff27 7 days ago 853MB
minio/minio latest 377fe6127f60 11 days ago 180MB
postgres alpine 0150e3200277 13 days ago 278MB
node latest e4f23baa3e59 13 days ago 1.12GB
emqx latest bcc4150a5c55 13 days ago 227MB
debian latest d4ccddb816ba 2 weeks ago 117MB
mongo latest 6551ff2e441b 2 weeks ago 887MB
star7th/showdoc latest 2d407fa5a504 3 weeks ago 590MB
ruby latest 6d367d8d0d54 3 weeks ago 1GB
mariadb latest a914eff5d2eb 3 weeks ago 336MB
alpine latest aded1e1a5b37 3 weeks ago 7.83MB
php latest d1603ae6b08a 3 weeks ago 547MB
nginx latest b52e0b094bc0 4 weeks ago 192MB
nginx alpine 1ff4bb4faebc 4 weeks ago 47.9MB
python latest 36d17f72f4f3 5 weeks ago 1.02GB
ubuntu latest a04dc4851cbc 6 weeks ago 78.1MB
httpd latest 0de612e99135 6 weeks ago 148MB
mysql latest 5568fddd4f66 6 weeks ago 797MB
redis alpine 8f5c54441eb9 2 months ago 41.4MB
redis latest 43724892d6db 2 months ago 117MB
apache/kafka latest 2956061ba5d3 4 months ago 404MB
centos latest 5d0da3dc9764 3 years ago 231MB
databases latest 5390d92f4023 3 years ago 449MB
rsyslog/syslog_appliance_alpine latest 93bb7d1f5f5a 6 years ago 14MB
提示No such file or directory
进一步优化脚本将/替换为-,脚本如下:
#!/bin/bash
# docker_save1.sh
# 功能:批量导出Docker镜像并压缩为tar.gz
# 镜像列表(按需修改)
images=(
"hub.zentao.net/app/zentao"
"rabbitmq"
"golang"
"minio/minio"
"postgres:alpine"
"emqx"
"gitlab/gitlab-ce"
"debian"
"mongo"
"star7th/showdoc"
"mariadb"
"alpine"
"php"
"nginx"
"nginx:alpine"
"python"
"ubuntu"
"httpd"
"mysql"
"redis:alpine"
"redis"
"apache/kafka"
"centos"
)
# 输出目录(按需修改)
output_dir="./backup_$(date +%Y%m%d)"
mkdir -p "$output_dir"
# 批量导出
for image in "${images[@]}"; do
# 生成安全文件名(替换/为_)
safe_name=$(echo "$image" | sed 's|/|_|g')
output_file="${output_dir}/${safe_name}_$(date +%Y%m%d).tar.gz"
# 检查镜像是否存在
if ! docker inspect "$image" &> /dev/null; then
echo "错误:镜像 $image 不存在,跳过保存"
continue
fi
# 保存并压缩
echo "正在处理: $image"
if docker save "$image" | gzip > "$output_file"; then
echo "已保存到: $output_file"
else
echo "保存失败,请检查磁盘空间或权限"
exit 1
fi
done
echo "所有镜像已备份至目录: $output_dir"
但是发现nginx只导出了一个,并且showdoc的镜像名称太长了,如下图:
所以进一步优化脚本为:
#!/bin/bash
# docker_save1.sh
# 功能:批量导出Docker镜像并压缩为tar.gz
# 镜像列表(按需修改)
images=(
"hub.zentao.net/app/zentao"
"rabbitmq"
"golang"
"minio/minio"
"postgres:alpine"
"emqx"
"gitlab/gitlab-ce"
"debian"
"mongo"
"star7th/showdoc"
"mariadb"
"alpine"
"php"
"nginx"
"nginx:alpine"
"python"
"ubuntu"
"httpd"
"mysql"
"redis:alpine"
"redis"
"apache/kafka"
"centos"
)
# 输出目录(按需修改)
output_dir="./backup_$(date +%Y%m%d)"
mkdir -p "$output_dir"
# 批量导出
for image in "${images[@]}"; do
# 生成安全文件名(替换/为_)
safe_name=$(echo "$image" | sed -E 's|.*/([^/]+/[^/]+)$|\1|; t; s|^.*$|&|' | sed 's|/|_|g' | sed 's|:|_|g')
output_file="${output_dir}/${safe_name}_$(date +%Y%m%d).tar.gz"
# 检查镜像是否存在
if ! docker inspect "$image" &> /dev/null; then
echo "错误:镜像 $image 不存在,跳过保存"
continue
fi
# 保存并压缩
echo "正在处理: $image"
if docker save "$image" | gzip > "$output_file"; then
echo "已保存到: $output_file"
else
echo "保存失败,请检查磁盘空间或权限"
exit 1
fi
done
echo "所有镜像已备份至目录: $output_dir"
这次导出终于完美了