文章目录
- 一,简要概述
- 二,基础知识
-
- [1, docker images查看镜像列表](#1, docker images查看镜像列表)
- [2, docker images --format 获取镜像关键信息](#2, docker images --format 获取镜像关键信息)
- [3, shell遍历命令输出:for循环](#3, shell遍历命令输出:for循环)
- [4, shell遍历命令输出:while read循环](#4, shell遍历命令输出:while read循环)
- 三,实现解析
-
- 1,使用ImageId_Tag命名
- 2,借助文件,字符串替换,使用Repository_Tag命名
- 3,借助for循环,字符串替换,使用Repository_Tag命名
- [4,借助while read循环,字符串替换,使用Repository_Tag命名](#4,借助while read循环,字符串替换,使用Repository_Tag命名)
- [5,借助while read循环,字符串截取,使用Repository_Tag命名](#5,借助while read循环,字符串截取,使用Repository_Tag命名)
- [6, 整体导出](#6, 整体导出)
一,简要概述
在如何下载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-