镜像迁移脚本

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

镜像迁移流程

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

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']}")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vivado编译设置、执行设置、bit流生成设置

合成设置 使用“合成设置”可以指定约束集、合成策略、合成选项,以及要生成的报告。选项由选定的定义综合策略或综合报告策略,但您可以用自己的策略覆盖这些策略设置。您可以选择一个选项来查看对话框底部的描述。了解更多有关“合成设置”的信息&#…

【设计模式-03】Strategy策略模式及应用场景

一、简要描述 Java 官方文档 Overview (Java SE 18 & JDK 18)module indexhttps://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 & JDK 18)declaration: module: java.base, pa…

品牌出海新篇章:DTC营销与红人矩阵的完美结合

随着全球市场的竞争日益激烈,品牌在出海过程中面临着前所未有的挑战。传统的销售渠道逐渐显得滞后,DTC模式正成为品牌开拓国际市场的新趋势。在这一趋势中,结合红人矩阵的DTC营销策略备受关注,为品牌打开了一扇通向全球市场的大门…

基于爬虫和Kettle的书籍信息采集与预处理

一:爬虫 1、爬取的目标 将读书网上的书籍的基本信息,比如:封面、书名、作者、出版社、价格、出版时间、内容简介、作者简介、书籍目录、ISBN和标签爬取出来,并将爬取的结果放入数据库中,方便存储。 2、网站结构 图1读…

利用网络威胁情报增强网络安全态势

在当今的网络威胁形势下,明智且主动的防御策略至关重要。网络威胁情报是组织的重要工具,可帮助他们预测和应对网络风险。网络威胁情报不仅提供原始数据,还提供: 深入了解网络攻击者的动机了解他们的潜在目标了解他们的战术 通过…

如何运用TRIZ理论解决电动汽车的续航里程问题?

电动汽车的普及在很大程度上受到续航里程的制约。面对这一问题,传统的解决方案往往只能治标不治本。然而,TRIZ理论为我们提供了一个全新的视角,帮助我们从根本上解决这一难题。 TRIZ,全称为“发明问题解决理论”,是由苏…

java SSM物资采购管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM物资采购管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代 码和数据库,系统主要采…

JDBC-数据库连接池(druid)

一、背景 在介绍JDBC基本概念中,似乎Java程序每次与数据库交互都要通过驱动创建一个新的连接对象(Connection),再由连接对象创建一个可执行SQL的Statement对象(或PreparedStatement对象),操作完…

一键搭建elk

一键启动elk 1. 生成环境的脚本 setup.sh #!/usr/bin/bash# logstash enviroment mkdir -p logstash touch logstash/logstash.conf # shellcheck disableSC1078 echo input {tcp {mode > "server"host > "0.0.0.0"port > 4560codec > jso…

HCIP OSPF实验

任务: 1.使用三种解决ospf不规则区域的方法 2.路由器5、6、7、8、15使用mgre 3.使用各种优化 4.全网可达 5.保证更新安全 6.使用地址为172.16.0.0/16合理划分 7.每个路由器都有环回 拓扑图&IP划分如下: 第一步,配置IP&环回地址…

【面试突击】网关系统面试实战

🌈🌈🌈🌈🌈🌈🌈🌈 欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理…

Netty 介绍、使用场景及案例

Netty 介绍、使用场景及案例 1、Netty 介绍 https://github.com/netty/netty Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可扩展的网络服务器和客户端。它是一个开源项目,最初由JBoss公司开发,现在由社区维护。Netty的…

qt初入门2:qt选择一个文件或者目录,获取当前目录,操作文件目录等整理

最近用qt操作文件或者目录的动作比较多,简单整理一下常用的接口,方便回顾。 总的来说,其实就是用文件选择对话框QFileDialog类,以及操作文件信息的QFileInfo类,以及相关QCoreApplication中静态成员函数获取一些信息&a…

对话姿美堂创始人董事长徐熙明:不受短期诱惑和外界噪音的影响,坚持做难而正确的事

“ 客户至上 ” 整理 | 云舒&凯丰 编辑 | 梦遥 出品|极新&北京电子商务协会 在过去几年中,直播电商经历了显著的发展,成为数字化零售领域的一个重要分支。随着智能手机和高速互联网的普及,消费者的购物习惯发生…

聚焦老年生活与健康,“老有所依·情暖夕阳”元岗街社区微型养老博览会顺利开展

尊老敬老是中华民族的传统美德, 爱老助老是全社会的共同责任。 家有一老,如有一宝, 长者的生活情况是一个家庭的头等大事, 做好长者服务是街道和社区的重要工作。 2024年1月6日,由元岗街道党工委、元岗街道办事处、…

OpenGl 19高级GLSL

一.GLSL的内建变量 在着色器中,需要当前着色器以外地方的数据的话,必须把数据传进来。之前我们是通过uniform类型和采样器来完成的。之外,GLSL还支持另外几个以gl为前缀的变量,提供更多读写数据的方式,比如说顶点着色…

ES高级查询

ES中提供了一种强大的检索数据方式,这种检索方式称为Query DSL,这种方式的丰富查询语法让ES检索变得更强大,更简洁。 1.常见查询 1.1查询所有[match_all] match_all关键字:返回索引中的全部文档。 GET /products/_search { &…

acwing4986.互质数的个数

题目不难 有个好的细节想着分享一下 一开始写的有点问题&#xff5e;需要特判掉一个... #include<bits/stdc.h> using namespace std; using ll long long; const int N 1e510;const ll mod 998244353;ll qmi(ll a,ll b){ll ans 1;while(b){if(b&1)ans ans*a%…

(20)Linux初始文件描述符

前言&#xff1a;本章我们介绍 O_WRONLY, O_TRUNC, O_APPEND 和 O_RDONLY。之后我们开始讲解文件描述符。 一、系统传递标记位 1、O_WRONLY C 语言在 w 模式打开文件时&#xff0c;文件内容是会被清空的&#xff0c;但是 O_WRONLY 好像并非如此&#xff1f; 代码演示&…

H264码流进行RTP包封装

一.H264基本概念 H.264从框架结构上分为视频编码层&#xff08;VCL&#xff09;和网络抽象层&#xff08;NAL&#xff09;&#xff0c;VCL功能是进行视频编解码&#xff0c;包括运动补偿预测&#xff0c;变换编码和熵编码等功能&#xff1b;NAL用于采用适当的格式对VCL视频数据…