镜像迁移脚本

在日常的服务部署开发中,我们有时需要迁移环境,将服务器上的私有镜像从一个服务器迁移到另一个服务器中。在以微服务为架构的项目中,我们的一个项目可能存在大量的镜像,对每一个镜像单独进行导出打包迁移即重复又麻烦,针对这种情况,我们可以通过开发脚本来实现快速的迁移部署,减少重复工作。

镜像迁移流程

  • 导出镜像为打包文件
  • 迁移镜像到其他服务器
  • 导入镜像
  • [可选]根据需要修改镜像标签
  • [可选]推送镜像到镜像中心

Python脚本处理

获取镜像列表

table格式显示镜像列表

bash环境中,我们一般通过 [docker] image ls命令会以 table格式显示服务器中的镜像。

[docker] image ls

json格式显示镜像列表

table格式显示的镜像虽然直观,但是脚本以流的方式读取内容为 str类型数据,str类型针对 table格式转化出的数据处理相对比较麻烦。所以针对镜像列表的获取,我们可以采用 json格式进行读取。

[docker] image ls –help

调用 docker image ls --help命令可知,docker 输出镜像列表支持通过 --format参数指定输出格式内容。

json格式显示镜像列表

调用 docker image ls --format json以json格式显示镜像列表

[docker] image ls –format json

兼容旧版Docker显示json格式镜像列表

在旧版的docker中,没有默认的json模板,此时调用 docker image ls --format json命令将无法正确显示镜像列表,阅读 docker image ls --help的输出和docker go format官网文档。可以看到,docker是通过go template进行的格式化输出,针对这种情况,可以在输出时通过手动设置json模板 {{json .}}来显示json格式内容。

调用 docker image ls --format "{{json .}}"以json格式显示镜像列表

[docker] image ls –format “{​{json .}}”

注意 --format string这里,以json模板进行输出时,""是可选项,但是在设置模板时,""是必选项,否则会导致输出错误。

Python获取shell输入流

bash环境中,我们一般通过管道 |获取上一步操作的输入流进行操作。在Python中,我们可以通过 os或者 subprocess库来执行shell命令。

subprocess获取输入流

在Python的subprocess依赖库中,可以通过 subprocess.getoutput(cmd)命令来获取输入流内容,将输入流转化为 str类型数据。

os获取输入流

在Python的os依赖库中,可以通过 os.popen(cmd).read()命令来获取输入流内容,将输入流转化为 str类型数据。

推荐使用os来获取输入流,具有更好的兼容性,即使在Python2版本上也支持使用

str转jsonl

以json格式输出的镜像列表,是每个镜像都以json格式进行输出,整体是以jsonl的格式,所以不可以通过 json.load()来解析转化json数据,针对该情况,可以编写函数来实现将输入流转化为列表进行处理。

def str2jsonl(string):"""str类型数据转换为jsonl(列表)"""jsonl = []lines = string.split('\n')for line in lines:if line.strip() != '':jsonl.append(json.loads(line))return jsonl

Python执行shell命令

在python中,可以通过 os.system(cmd)命令来执行shell命令。

导出镜像为打包文件

导出镜像并打包的命令为: docker save ${image_id} | gzip -c > ${filename}.tar.gz

def save_images():"""导出镜像为.tar.gz文件到本地"""# 执行shell命令,获取输入流images = os.popen('docker image ls --format "{{json .}}"').read()images = str2jsonl(images)for image in images:tag = ""for _tag in image['Tag'].split('.'):tag = tag + "_" + _tag# 导出镜像 | 将镜像打包为tar.gz文件os.system(f"docker save {image['Repository']}:{image['Tag']} | gzip -c > {image['Repository'].split('/')[-1]}_{tag}.tar.gz")

迁移镜像(网络互通)

导出镜像为 .tar.gz后,可以根据网络环境通过传输文件的方式将镜像传输到其他服务器中。

但是在网络互通的环境中,可以直接通过Python启动文件服务器的方式快速传输:

python3:python3 -m http.server 8000

python2: python -m SimpleHTTPServer 8080

在导出镜像服务器通过python命令快速启动一个文件服务器,其他服务器即可通过 IP:Port的方式访问获取文件。

在传输完文件后,尽快将文件服务器关闭,避免网络内其他人无授权访问主机内容。

导入镜像

导入镜像命令为: docker load -i ${filename}

def str2list(string):return string.split('\n')def load_images():"""导入镜像"""# 执行shell命令,获取输入流images = os.popen('ls').read()images = str2list(images)for image in images:if '' != image:os.system(f"docker load -i {image}")

[可选]修改镜像标签

在进行服务迁移时,我们可能根据需要,需要修改镜像的标签,以便后续将镜像推送到指定镜像中心。一般这种情况下,修改镜像标签主要是修改镜像中心前缀和项目名,修改相对固定,可以通过脚本来实现统一修改。

修改镜像标签命令: docker tag ${old_image_tag} ${new_image_tag}

def fix_tags(image_center: str, project_name: str):# 执行shell命令,获取输入流images = os.popen('docker image ls --format "{{json .}}"').read()images = str2jsonl(images)for image in images:if len(image['Repository'].split("/")) >= 2:repository = f"{image['Repository'].split('/')[-2]}/{image['Repository'].split('/')[-1]}"else:repository = image['Repository'].split("/")[-1]os.system(f"docker tag {image['Repository']}:{image['Tag']}\t\t{image_center}/{project_name}/{repository}:{image['Tag']}")

[可选]推送镜像到镜像中心

登陆镜像中心命令: docker login -u ${username} ${image_center}

推送镜像标签命令: docker push ${image}

Docker会根据镜像名前缀推送到指定镜像中心。

def push_images():"""推送镜像到镜像中心"""# 执行shell命令,获取输入流images = os.popen('docker image ls --format "{{json .}}"').read()images = str2jsonl(images)for image in images:os.system(f"docker push -i {image['Repository']}:{image['Tag']}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/344249.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot3+EasyExcel由浅入深

环境介绍 技术栈 springboot3easyexcel 软件 版本 IDEA IntelliJ IDEA 2022.2.1 JDK 17 Spring Boot 3 EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、…

LabVIEW在动态力传感器校准技术的创新应用

简介 动态力传感器校准装置集成了冲击法原理和自动化控制,实现精准、高效的传感器校验。LabVIEW的图形化界面提供简便操作和实时数据分析,显著提高了校准过程的准确度和效率。 01 系统设计和功能 动态力传感器在工业生产中发挥着重要作用,…

Docker 安装部署

1、Docker 安装 ① 卸载docker,清空之前的docker文件 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine \docker-ce…

数据库创建表并插入数据练习题

一、创建表的要求 创建一个英雄表(hero) 主键 name nickname address groups email telphone 二、 操作步骤 1.登录MySQL [rootlocalhost ~]# systemctl start mysqld [rootlocalhost ~]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with…

【网络安全】【密码学】【北京航空航天大学】实验三、数论基础(下)【C语言实现】

实验三、数论基础(下) 一、实验内容 1、中国剩余定理(Chinese Remainder Theorem) (1)、算法原理 m1, m2, … mk 是一组两两互素的正整数,且 M m1 m2 … mk 为它们的乘积, 则如下的同余…

使用new pm写一个pass

范例来自LLVM Techniques, Tips, and Best Practices Clang and Middle-End Libraries llvm ir到ir是由一个个pass处理的,从一个ir到另一个ir会改变一些东西 书里面就是说想要给指针变量添加一个noalias属性 书里面使用插件的形式,但是不知道怎么我搞不…

MetaGPT前期准备与快速上手

大家好,MetaGPT 是基于大型语言模型(LLMs)的多智能体协作框架,GitHub star数量已经达到31.3k。 接下来我们聊一下快速上手 这里写目录标题 一、环境搭建1.python 环境2. MetaGpt 下载 二、MetaGPT配置1.调用 ChatGPT API 服务2.简…

手机扫一扫文档、证件表格就能打印,不用专门找扫描软件啦

现在各大品牌的手机扫一扫功能都可以满足扫描文档、扫描表格的功能,平常如果需要将纸质文件扫描成电子档,拿起手机就可以实现。文件签名后再扫描成PDF版本,相信大家都用得不少了。 今天就用华为手机的扫一扫给大家示范一下如何将文档、证件、…

设计模式—行为型模式之状态模式

设计模式—行为型模式之状态模式 状态(State)模式:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。 状态模式包含以下主要角色: 环境类&am…

Kafka配置Kerberos安全认证及与Java程序集成

Background 本文主要介绍在 Kafka 中如何配置 Kerberos 认证,以及 java 使用 JAAS 来进行 Kerberos 认证连接。本文演示为单机版。 所用软件版本 查看 Kerberos 版本命令:klist -V 软件名称版本jdk1.8.0_202kafka2.12-2.2.1kerberos1.15.1 1、Kerberos …

【STM32】STM32学习笔记-串口发送和接收(27)

00. 目录 文章目录 00. 目录01. 串口简介02. 串口相关API2.1 USART_Init2.2 USART_InitTypeDef2.3 USART_Cmd2.4 USART_SendData2.5 USART_ReceiveData 03. 串口发送接线图04. USB转串口模块05. 串口发送程序示例06. 串口发送支持printf07. 串口发送支持printf_v208.09.10. 01.…

Linux网络基础及bonding实际操作

1.查看linux基础的网络配置 网关:route -n ip地址:ifconfig 或 ip a DNS服务器:cat /etc/resolv.conf 主机名:hostname 路由:route -n 网络连接状态:ss 或 netstat 2.临时修改网卡名称 3.永久修…