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-

相关推荐
BullSmall7 小时前
Sonarqube9.9 docker 镜像启动后 conf 下的配置文件没有了
docker·容器·eureka
ruofu337 小时前
wsl端是py312,但是项目是py311, 如何下载py311的依赖包(wheels)
python·docker
spider_xcxc8 小时前
Docker 实战:容器化多服务应用,Dockerfile 与 Compose 配置全解析
docker·云原生·eureka·虚拟化·容器化
晚风吹长发9 小时前
Docker使用——Docker容器及相关命令
linux·运维·服务器·docker·容器·架构
ShiXZ2139 小时前
Docker Compose 安装与配置指南
运维·docker·容器
BullSmall10 小时前
Anolis OS 8.10 Docker 部署 SonarQube 9.9 完整教程
运维·docker·容器
开发者联盟league11 小时前
vscode 进入docker容器
vscode·docker
java_logo14 小时前
Apache Doris Docker 部署指南:实时分析数据库实战
数据库·docker·apache·doris·apache doris·轩辕镜像·docker部署doris
生活爱好者!1 天前
我把NAS当作下载机,docker一键部署qb
运维·docker·容器