当前位置: 首页 > article >正文

docker 镜像导出命令(支持所有镜像导出为独立的包)

Docker 镜像导出命令

网上搜到全部镜像导出为一个包的命令,没有搜到每个独立打包的命令,自己写了一下。

导出文件名为 : 镜像标签 + 创建时间 + 系统 + 架构 + 文件大小 + sha + 替换非法字符,自用足够了。

# 1. 替换日期 : `(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})` -->  `\1\2\3T\4\5\6` # 匹配到日期格式后重新连接 # sed 不支持 `\d`
# 2. 截取ID   : `sha256:(\w{10})\w{54}` --> `\1` # 64位拆分为前10位与后54位,仅保留前10位即可
# 3. 去除无用字符 : `[|]` --> ``  # 去除包裹镜像名称的`[]`符号
# 4. 文件名合法化 : `/:*?<>|\"` --> `_`  # 替换掉非法字符

# 初始化格式字符串,之后再使用每个语句
$ IMAGES_FORMAT="{{.Repository}}:{{.Tag}}"; \
  INSPECT_FORMAT="{{.RepoTags}}_{{.Created}}_{{.Os}}-{{.Architecture}}_{{.Size}}_{{.ID}}.tar"; \
  REGEX_TIME="s#\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9T]\{5\}\):\([0-9]\{2\}\):\([0-9]\{2\}\)#\1\2\3\4\5#g;"; \
  REGEX_ID="s#sha256:\(\w\{10\}\)\w\{54\}#\1#g;"; \
  REGEX_REMOVE="s#\[\|\]##g;"; \
  REGEX_REPLACE="s#[/:*?<>|\\\\\"]#_#g";

# 显示单个镜像名称 # "hello-world:latest"
$ IMAGE="hello-world"; docker images --format ${IMAGES_FORMAT} ${IMAGE};
# 显示单个镜像原始文件名 # "[hello-world:latest]_2023-05-02T16:49:27Z_linux-amd64_13256_sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a.tar"
$ IMAGE="hello-world"; docker inspect --format ${INSPECT_FORMAT} ${IMAGE};
# 显示单个镜像导出语句   # "# ==== docker save hello-world -o hello-world_latest_20230502T164927Z_linux-amd64_13256_d2c94e258d.tar"
$ IMAGE="hello-world"; \
  FROM=$(docker inspect --format ${INSPECT_FORMAT} ${IMAGE}); \
  FILE=$(echo ${FROM} | sed "${REGEX_TIME} ${REGEX_ID} ${REGEX_REMOVE} ${REGEX_REPLACE}"); \
  echo \# ==== docker save ${IMAGE} -o ${FILE};
# 显示所有镜像的导出语句
$ echo \# ==== IMAGES LIST COUNT : $(docker images -q | wc -l); \
  for IMAGE in $(docker images --format ${IMAGES_FORMAT} | sort); \
  do \
    FROM=$(docker inspect --format ${INSPECT_FORMAT} ${IMAGE}); \
    FILE=$(echo ${FROM} | sed "${REGEX_TIME} ${REGEX_ID} ${REGEX_REMOVE} ${REGEX_REPLACE}"); \
    echo \# ==== docker save ${IMAGE} -o ${FILE}; \
  done
# 执行每个镜像导出为单个文件 # docker save each images to each files.
$ echo \# ==== IMAGES LIST COUNT : $(docker images -q | wc -l); \
  for IMAGE in $(docker images --format ${IMAGES_FORMAT} | sort); \
  do \
    FROM=$(docker inspect --format ${INSPECT_FORMAT} ${IMAGE}); \
    FILE=$(echo ${FROM} | sed "${REGEX_TIME} ${REGEX_ID} ${REGEX_REMOVE} ${REGEX_REPLACE}"); \
    echo \# ==== docker save ${IMAGE} -o ${FILE}; \
    docker save ${IMAGE} -o ${FILE}; \
  done
  • 其他命令
# 以下每行命令均独立

# 导入镜像
docker load -i ${NAME}.tar
docker load <  ${NAME}.tar

# 导出一个镜像到一个文件内
docker save -o ${NAME}.tar ${IMAGE_NAME}:{IMAGE_TAG}
docker save ${IMAGE_NAME}:{IMAGE_TAG} > ${NAME}.tar
# 导出多个镜像到一个文件内
docker save -o ${NAME}.tar ${IMAGE1_NAME}:{IMAGE1_TAG} ${IMAGE2_NAME}:{IMAGE2_TAG}

# 显示镜像列表 # 格式 ${IMAGE_NAME}:{IMAGE_TAG}
IMAGES=$(docker images --format '{{.Repository}}:{{.Tag}}'); for element in ${IMAGES[@]}; do echo "${element}"; done
docker images | sed '1d' | awk '{print $1 ":" $2 }'
# 显示镜像列表 # 格式 ${IMAGE_ID} # 显示全部镜像的 ID
docker images -q

# 导出全部镜像到一个文件内
docker save $(docker images --format '{{.Repository}}:{{.Tag}}') -o ${NAME}.tar
# docker save $(docker images | sed '1d' | awk '{print $1 ":" $2 }') -o ${NAME}.tar
# docker save $(docker images -q) -o ${NAME}.tar
  • 提示

    • docker image ls 别名 docker images
    • --format 参数根据不同子命令,支持的格式不同。
    • images --format 支持表格和json输出两种形式。
    • inspect --format 支持的模板比较简单,扩展链接中的高级语法基本都不可用,但逻辑判断可用。
    • 查看镜像信息用 --format json 输出比较全面。
  • 参考

    • ls 命令介绍 : docker images | Docker Docs
    • –format 参数介绍 : Format command and log output | Docker Docs
    • –format 语法参考 : template package - text/template - Go Packages

http://www.kler.cn/a/286089.html

相关文章:

  • springboot 接口接收参数的注解介绍(@RequestParam,@PathVariable,@RequestBody 等)
  • Golang | Leetcode Golang题解之第377题组合总和IV
  • 欧科云链: Web3浪潮下合规是“必选项”, 技术创新成发展重点
  • 计算机毕业设计推荐-基于python的公司员工考勤管理系统
  • 【区块链 + 司法存证】链节区块链数字卷宗管理系统 | FISCO BCOS应用案例
  • 金融科技初创企业建设指南
  • 常使用的前端构建优化策略
  • phpstudy怎么用
  • 某东协议算法剖析 - H5st4.7.4
  • 初始MYSQL数据库(1)——创建、删除数据库和数据表的相关操作
  • Windows下Nacos安装与配置
  • HarmonyOS开发实战( Beta5版)小程序场景性能优化开发指导
  • python 实现一个简单的网页爬虫程序
  • 深度学习项目实践——QQ聊天机器人(transformer)(三)功能实现的方法——NoneBot2插件结构与编写
  • 怎样通过bs4找出程序中 标签<div class=“List2“>的内容?
  • 网络各层的安全实例:从物理层到应用层的保护
  • CPU、MPU、MCU、SOC分别是什么?
  • 代码随想录算法训练营第32天 | 509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯
  • 银行卡四要素验证如何用C#调用
  • 通信算法之230: 5G随机接入PRACH及长度计算