批量导出docker镜像

最近好多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"

这次导出终于完美了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值