云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

国外镜像转回镜像仓库脚本

jxf315 2024-12-10 16:18:24 教程文章 39 ℃

由于国内部署一下docker镜像的时候被限制了,但有时候需要去下载一些镜像转回本地服务器或者自己的镜像仓库时候,一个个手工下载比较慢。

刚好在测试部署Meterphere镜像,虽然很多是镜像是反正是过来镜像地址。但是还是有些基础镜像还不是,所以还是需要手工去拉。所以写一个工具脚本去执行,减少一点人工的操作。现在这个脚本还是比较粗糙,还是需要一个一个node节点去执行这个工具脚本,把上传到自己镜像仓库的镜像拉取到node节点上,然后在重新tag为原来镜像名,而且deplyment配置镜像拉取的策略的时候也可能需要修改。

总体思路就是:

1.可以访问镜像的节点服务器,读取imagelist.txt文件,拉取镜像到本地服务器。

2.重新tag为自己镜像服务器地址,push到自己镜像服务器,保存到newimagelist.txt中,用于后续重命名。

3.在需要拉取的node节点上,读取newimagelist.txt,拉取镜像到本地,多个节点,执行多次。(没有写远程命令执行,可以后续在通过ansible,执行远程调用命令优化,不需要一个个node执行)

4.还原镜像tag为原来镜像名字

# !/usr/bin/env python
# -*-coding:utf-8 -*-
# File       : dockerImageTools.py
# Time       :2024/11/22 14:31
# Author     :damon.guo
# version    :python 3.6
# @Software  : PyCharm
# Description:
import os
import sys

# 需要下载中转的镜像列表
imagesfile="./imagelist.txt" #自己新建一个人文件,镜像地址一行一个
# 需要重新tag原名称的列表
newimagesfile="./newimagelist.txt"
# 国内可以中转的镜像仓库/或者自己的仓库地址
dockerimageurl ="xx-registry.cn-hangzhou.aliyuncs.com/yek-dev/"
def getImageList(imagesfile):
    if not os.path.exists(imagesfile):
        print("image list file not exist")
        exit(1)
    imageList=[]
    with open(imagesfile) as fd:
        for i in fd.readlines():
            print(i)
            imageList.append(i.strip())
    return imageList
def pullImages(imageList):
    for i in imageList:
        print("pulling image %s" % i)
        os.system("docker pull %s" % i)
    print("pull image finished")

def checkImages(imageList):
    for i in imageList:
        print("checking image %s" % i)
        os.system("docker images | grep %s" % i)
    print("check image finished")
def pushImages(imageList):
    for i in imageList:
        print("pushing image %s" % i)
        os.system("docker push %s" % i)
    print("push image finished")
def tagImages(imageList,dockerimageurl):
    newImages = []
    for i in imageList:
        imagename = i.split("/")[-1]
        newimagname = os.path.join(dockerimageurl, imagename)
        print("tagging image %s to %s" % (i,newimagname))
        newImages.append(newimagname)
        os.system("docker tag %s %s " % (i, newimagname))
    print("tag image finished")
    return newImages

def dockerImageTools():
    # 外网机器执行拉取镜像,push自己镜像仓库
    imageList = getImageList(imagesfile)
    pullImages(imageList)
    checkImages(imageList)
    newImages = tagImages(imageList,dockerimageurl)
    with open(newimagesfile, "w")as fd:
        for i in newImages:
            fd.write(i+"\n")
    pushImages(newImages)

def renamedockerImage():
    # 国内服务器执行镜像,个人镜像仓库拉取镜像 还原镜像为国外镜像名字
    imageList = getImageList(imagesfile)  # 国外镜像地址文件""
    newimageList = getImageList(newimagesfile)  # 国内镜像地址文件""
    pullImages(newimageList)
    checkImages(newimageList)
    for i in newimageList:
        newimagename = i.split("/")[-1]
        for j in range(len(imageList)):
            imageurl = imageList[j]
            imagename = imageurl.split("/")[-1]
            if imagename == newimagename:
                print("tagging image %s to %s" % (i, imageurl))
                os.system("docker tag %s %s " % (i, imageurl))

if __name__ == "__main__":
    par =sys.argv[1]
    if par == "tochina":
        # 中转服务器执行,拉取镜像并提交到自己仓库
        dockerImageTools()
    elif par == "help" or par == "-h":
        print("请输入参数:tochina or help")
        print("请输入参数:tochina 中转服务器执行,拉取镜像并提交到自己仓库 ")
        print("请输入参数:rename # 国内服务器执行镜像,个人镜像仓库拉取镜像 还原镜像为国外镜像名字")
    elif par == "rename":
        renamedockerImage()
    else:
        # 国内服务器执行镜像,个人镜像仓库拉取镜像 还原镜像为国外镜像名字
        renamedockerImage()

最近发表
标签列表