Docker遍历镜像生成导出镜像命令六法

文章目录

一,简要概述

如何下载Distroless Java镜像 一文中,我们实现了使用香港地区云主机下载Distroless 镜像,并转成tar转存到国内云主机,加载镜像。

本着流程自动化的目的,我们需要借助shell脚本来生成导出镜像tar命令的功能。

二,基础知识

1, docker images查看镜像列表

bash 复制代码
[root@00fly ~]# docker images
REPOSITORY                                      TAG                      IMAGE ID       CREATED        SIZE
registry.cn-shanghai.aliyuncs.com/00fly/ebook   1.0.0                    db5775728d35   42 hours ago   27.9MB
eclipse-temurin                                 11-jre                   e814218ff484   6 days ago     294MB
eclipse-temurin                                 17-jre                   2bbdd664aaf4   6 days ago     295MB
eclipse-temurin                                 8-jre                    568d51bb3e3f   6 days ago     263MB
maven                                           3.9-eclipse-temurin-11   bf188cb43f49   2 weeks ago    492MB
maven                                           3.9-eclipse-temurin-8    eafcdbd2dc38   2 weeks ago    366MB
maven                                           3.9-eclipse-temurin-17   4c32dafc2585   2 weeks ago    512MB
gcr.io/distroless/java21-debian12               latest                   ab93ba9e68c5   56 years ago   192MB
gcr.io/distroless/java17-debian13               latest                   980a1e41876e   56 years ago   168MB
gcr.io/distroless/java21-debian13               latest                   7bb5ad39aa79   56 years ago   192MB
gcr.io/distroless/java25-debian13               latest                   673aff39d2cb   56 years ago   226MB
gcr.io/distroless/java                          latest                   4c4b3da468da   56 years ago   210MB
gcr.io/distroless/java17-debian12               latest                   e2014a5091cf   56 years ago   226MB
gcr.io/distroless/java17-debian11               latest                   290bd0397573   N/A            226MB
gcr.io/distroless/java11-debian11               latest                   42b1763c76e2   N/A            209MB

2, docker images --format 获取镜像关键信息

--format的使用可以自己参考Go语言的模板语法

常见用法如下

bash 复制代码
docker images --format "{{.ID}}\t{{.Repository}}\t{{.Tag}}"
docker images --format "{{.Repository}}:{{.Tag}}"
bash 复制代码
[root@00fly ~]# docker images --format "{{.Repository}}:{{.Tag}}"
registry.cn-shanghai.aliyuncs.com/00fly/ebook:1.0.0
eclipse-temurin:11-jre
eclipse-temurin:17-jre
eclipse-temurin:8-jre
maven:3.9-eclipse-temurin-11
maven:3.9-eclipse-temurin-8
maven:3.9-eclipse-temurin-17
gcr.io/distroless/java17-debian12:latest
gcr.io/distroless/java:latest
gcr.io/distroless/java25-debian13:latest
gcr.io/distroless/java17-debian13:latest
gcr.io/distroless/java21-debian12:latest
gcr.io/distroless/java21-debian13:latest
gcr.io/distroless/java17-debian11:latest
gcr.io/distroless/java11-debian11:latest

3, shell遍历命令输出:for循环

适合简单输出,注意空格问题,通过$(command)或反引号command将命令输出转换为列表,由for循环依次读取。

基本语法:

shell 复制代码
for item in $(command);
do
  ...;
done

4, shell遍历命令输出:while read循环

(适合处理复杂输出,如含空格、多行文本)通过管道或重定向,将命令输出逐行(或逐词)读取,能完美解决空格和特殊字符的解析问题,是处理复杂输:出的首选。

基本语法:

shell 复制代码
command|while read item;
do
  ...;
done

三,实现解析

1,使用ImageId_Tag命名

shell 复制代码
#!/bin/bash
docker images --format "docker save {{.Repository}}:{{.Tag}} > {{.ID}}_{{.Tag}}.tar"

执行结果

bash 复制代码
[root@00fly ~]# docker images --format "docker save {{.Repository}}:{{.Tag}} > {{.ID}}_{{.Tag}}.tar"
docker save registry.cn-shanghai.aliyuncs.com/00fly/ebook:1.0.0 > db5775728d35_1.0.0.tar
docker save eclipse-temurin:11-jre > e814218ff484_11-jre.tar
docker save eclipse-temurin:17-jre > 2bbdd664aaf4_17-jre.tar
docker save eclipse-temurin:8-jre > 568d51bb3e3f_8-jre.tar
docker save maven:3.9-eclipse-temurin-11 > bf188cb43f49_3.9-eclipse-temurin-11.tar
docker save maven:3.9-eclipse-temurin-8 > eafcdbd2dc38_3.9-eclipse-temurin-8.tar
docker save maven:3.9-eclipse-temurin-17 > 4c32dafc2585_3.9-eclipse-temurin-17.tar
docker save gcr.io/distroless/java17-debian12:latest > e2014a5091cf_latest.tar
docker save gcr.io/distroless/java17-debian13:latest > 980a1e41876e_latest.tar
docker save gcr.io/distroless/java21-debian13:latest > 7bb5ad39aa79_latest.tar
docker save gcr.io/distroless/java:latest > 4c4b3da468da_latest.tar
docker save gcr.io/distroless/java21-debian12:latest > ab93ba9e68c5_latest.tar
docker save gcr.io/distroless/java25-debian13:latest > 673aff39d2cb_latest.tar
docker save gcr.io/distroless/java11-debian11:latest > 42b1763c76e2_latest.tar
docker save gcr.io/distroless/java17-debian11:latest > 290bd0397573_latest.tar

2,借助文件,字符串替换,使用Repository_Tag命名

shell 复制代码
#!/bin/bash
docker images --format "{{.Repository}}:{{.Tag}}" > temp.txt

cat temp.txt | while read LINE
do  
  echo -n "docker save $LINE > "
  echo -n  $LINE | sed 's/\//\-/g'
  echo ".tar"
done

rm -rf temp.txt

执行结果

bash 复制代码
docker save registry.cn-shanghai.aliyuncs.com/00fly/ebook:1.0.0 > registry.cn-shanghai.aliyuncs.com-00fly-ebook:1.0.0.tar
docker save eclipse-temurin:11-jre > eclipse-temurin:11-jre.tar
docker save eclipse-temurin:17-jre > eclipse-temurin:17-jre.tar
docker save eclipse-temurin:8-jre > eclipse-temurin:8-jre.tar
docker save maven:3.9-eclipse-temurin-11 > maven:3.9-eclipse-temurin-11.tar
docker save maven:3.9-eclipse-temurin-8 > maven:3.9-eclipse-temurin-8.tar
docker save maven:3.9-eclipse-temurin-17 > maven:3.9-eclipse-temurin-17.tar
docker save gcr.io/distroless/java17-debian12:latest > gcr.io-distroless-java17-debian12:latest.tar
docker save gcr.io/distroless/java17-debian13:latest > gcr.io-distroless-java17-debian13:latest.tar
docker save gcr.io/distroless/java21-debian12:latest > gcr.io-distroless-java21-debian12:latest.tar
docker save gcr.io/distroless/java:latest > gcr.io-distroless-java:latest.tar
docker save gcr.io/distroless/java21-debian13:latest > gcr.io-distroless-java21-debian13:latest.tar
docker save gcr.io/distroless/java25-debian13:latest > gcr.io-distroless-java25-debian13:latest.tar
docker save gcr.io/distroless/java17-debian11:latest > gcr.io-distroless-java17-debian11:latest.tar
docker save gcr.io/distroless/java11-debian11:latest > gcr.io-distroless-java11-debian11:latest.tar

3,借助for循环,字符串替换,使用Repository_Tag命名

shell 复制代码
#!/bin/bash
for LINE in $(docker images --format "{{.Repository}}:{{.Tag}}")
do  
  echo -n "docker save $LINE > "
  echo -n  $LINE | sed 's/\//\-/g'
  echo ".tar"
done

执行结果

bash 复制代码
docker save registry.cn-shanghai.aliyuncs.com/00fly/ebook:1.0.0 > registry.cn-shanghai.aliyuncs.com-00fly-ebook:1.0.0.tar
docker save eclipse-temurin:11-jre > eclipse-temurin:11-jre.tar
docker save eclipse-temurin:17-jre > eclipse-temurin:17-jre.tar
docker save eclipse-temurin:8-jre > eclipse-temurin:8-jre.tar
docker save maven:3.9-eclipse-temurin-11 > maven:3.9-eclipse-temurin-11.tar
docker save maven:3.9-eclipse-temurin-8 > maven:3.9-eclipse-temurin-8.tar
docker save maven:3.9-eclipse-temurin-17 > maven:3.9-eclipse-temurin-17.tar
docker save gcr.io/distroless/java17-debian12:latest > gcr.io-distroless-java17-debian12:latest.tar
docker save gcr.io/distroless/java17-debian13:latest > gcr.io-distroless-java17-debian13:latest.tar
docker save gcr.io/distroless/java21-debian12:latest > gcr.io-distroless-java21-debian12:latest.tar
docker save gcr.io/distroless/java:latest > gcr.io-distroless-java:latest.tar
docker save gcr.io/distroless/java21-debian13:latest > gcr.io-distroless-java21-debian13:latest.tar
docker save gcr.io/distroless/java25-debian13:latest > gcr.io-distroless-java25-debian13:latest.tar
docker save gcr.io/distroless/java17-debian11:latest > gcr.io-distroless-java17-debian11:latest.tar
docker save gcr.io/distroless/java11-debian11:latest > gcr.io-distroless-java11-debian11:latest.tar

4,借助while read循环,字符串替换,使用Repository_Tag命名

shell 复制代码
#!/bin/bash
docker images --format "{{.Repository}}:{{.Tag}}" | while read LINE
do  
  echo -n "docker save $LINE > "
  echo -n  $LINE | sed 's/\//\-/g'
  echo ".tar"
done

执行结果

bash 复制代码
docker save registry.cn-shanghai.aliyuncs.com/00fly/ebook:1.0.0 > registry.cn-shanghai.aliyuncs.com-00fly-ebook:1.0.0.tar
docker save eclipse-temurin:11-jre > eclipse-temurin:11-jre.tar
docker save eclipse-temurin:17-jre > eclipse-temurin:17-jre.tar
docker save eclipse-temurin:8-jre > eclipse-temurin:8-jre.tar
docker save maven:3.9-eclipse-temurin-11 > maven:3.9-eclipse-temurin-11.tar
docker save maven:3.9-eclipse-temurin-8 > maven:3.9-eclipse-temurin-8.tar
docker save maven:3.9-eclipse-temurin-17 > maven:3.9-eclipse-temurin-17.tar
docker save gcr.io/distroless/java17-debian12:latest > gcr.io-distroless-java17-debian12:latest.tar
docker save gcr.io/distroless/java17-debian13:latest > gcr.io-distroless-java17-debian13:latest.tar
docker save gcr.io/distroless/java21-debian12:latest > gcr.io-distroless-java21-debian12:latest.tar
docker save gcr.io/distroless/java:latest > gcr.io-distroless-java:latest.tar
docker save gcr.io/distroless/java21-debian13:latest > gcr.io-distroless-java21-debian13:latest.tar
docker save gcr.io/distroless/java25-debian13:latest > gcr.io-distroless-java25-debian13:latest.tar
docker save gcr.io/distroless/java17-debian11:latest > gcr.io-distroless-java17-debian11:latest.tar
docker save gcr.io/distroless/java11-debian11:latest > gcr.io-distroless-java11-debian11:latest.tar

5,借助while read循环,字符串截取,使用Repository_Tag命名

shell 复制代码
#!/bin/bash
docker images --format "{{.Repository}}:{{.Tag}}" | while read LINE
do  
  echo -n "docker save ${LINE} > "
  echo "${LINE##*/}.tar" 
done

执行结果

bash 复制代码
docker save registry.cn-shanghai.aliyuncs.com/00fly/ebook:1.0.0 > ebook:1.0.0.tar
docker save eclipse-temurin:11-jre > eclipse-temurin:11-jre.tar
docker save eclipse-temurin:17-jre > eclipse-temurin:17-jre.tar
docker save eclipse-temurin:8-jre > eclipse-temurin:8-jre.tar
docker save maven:3.9-eclipse-temurin-11 > maven:3.9-eclipse-temurin-11.tar
docker save maven:3.9-eclipse-temurin-8 > maven:3.9-eclipse-temurin-8.tar
docker save maven:3.9-eclipse-temurin-17 > maven:3.9-eclipse-temurin-17.tar
docker save gcr.io/distroless/java:latest > java:latest.tar
docker save gcr.io/distroless/java17-debian12:latest > java17-debian12:latest.tar
docker save gcr.io/distroless/java21-debian13:latest > java21-debian13:latest.tar
docker save gcr.io/distroless/java25-debian13:latest > java25-debian13:latest.tar
docker save gcr.io/distroless/java17-debian13:latest > java17-debian13:latest.tar
docker save gcr.io/distroless/java21-debian12:latest > java21-debian12:latest.tar
docker save gcr.io/distroless/java17-debian11:latest > java17-debian11:latest.tar
docker save gcr.io/distroless/java11-debian11:latest > java11-debian11:latest.tar

6, 整体导出

注意:镜像较多的话,体积会比较大,处理时间较长

bash 复制代码
docker save $(docker images --format '{{.Repository}}:{{.Tag}}') -o allinone.tar

有任何问题和建议,都可以向我提问讨论,大家一起进步,谢谢!

-over-

相关推荐
骇客野人1 小时前
Docker Compose 部署多个独立 Jar 服务完整实操步骤
docker·容器·jar
云川之下3 小时前
【k8s】Docker inspect 命令
docker·容器·kubernetes
倔强的石头1064 小时前
飞牛OS部署Mtab:Docker搭建自托管书签导航并实现远程访问
运维·docker·容器
apgk120 小时前
基于Canal实现mysql数据同步到消息队列(RabbitMQ/Kafka)详细操作教程
docker·kafka·rabbitmq
fatcoder20 小时前
玩转Docker 06 — 容器网络
前端·后端·docker
AR_xsy21 小时前
docker--资源配额 配置
运维·docker·容器
国际云,接待1 天前
Docker 容器突然退出、服务莫名重启:从 OOMKilled 到内存泄漏的生产排查手册
运维·docker·容器
橙-极纪元1 天前
把docker的镜像文件从一台服务器中,迁移至另一台服务器
服务器·docker·容器
雨声不在1 天前
docker-android 重启后镜像起不来
android·docker·容器
宋辰轩1 天前
Docker导致的wsl2崩溃问题
docker·wsl2