容器镜像迁移怎么做,流程操作是什么
Admin 2022-08-19 群英技术资讯 240 次浏览
最近因为基础设施调整,需要进行harbor 镜像仓库的迁移,主要是旧版本很老了,不想使用,直接
打算部署新的,原以为直接使用复制功能就可以,但是发现版本差异太大,直接失败,本打算使用中间
版本过度进行迁移,但是需要测试,好多功能,而且配置有点费事,尽管官方提供了升级说明,但是没敢
用,就怕出故障
project
, repo
,tags
, 因为harbor 的界面就是基于bff 模式开发 dockerimagehost/project/image:tag
docker pull dockerimageold/project/image:tag
docker tag dockerimageold/project/image:tag dockerimagenew/project/image:tag
docker push dockerimagenew/project/image:tag
为了简化同步,使用了管理员的权限,同时对于project 的权限,也是可以通过rest api 操作的
为了方便使用nodejs 开发
yarn init -y
yarn add node-fetch
yarn add npm-run-all --dev
因为项目原因,只粘贴部分代码,如果后边有时间可以搞成一个通用的服务,同时演示的代码是固定project的,
当然这样是有原因的,类似分治,可以方便问题project 单独快速处理
const fetch = require('node-fetch');
var project_images = []
// fetch project repos
fetch(`https://dockerimageold/api/repositories?project_id=projectid`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
"Authorization": "Basic base64username+password"
}
}).then(res => res.json()).then(repos => {
repos.forEach(repo => {
setTimeout(() => {
fetch(`https://dockerimageold/api/repositories/tags?repo_name=${repo}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
})
.then(res => res.json())
.then(tags => {
if (tags.length > 0) {
tags.forEach(tag => {
let imageinfo = {
reponame: repo,
oldimageinfo: `dockerimageold/${repo}:${tag}`,
newimageinfo: `dockerimagenew/${repo}:${tag}`,
repo_image: `${repo}:${tag}`
};
project_images.push(imageinfo)
});
}
})
.catch(err => {
console.log(repo)
})
}, 1000)
})
})
setTimeout(() => {
project_images.forEach(item => {
pull_push_sh = `docker pull dockerimageold/${item.repo_image} && docker tag dockerimageold/${item.repo_image} dockerimagenew/${item.repo_image} && docker push dockerimagenew/${item.repo_image}`
console.log(pull_push_sh)
})
}, 10000)
"scripts": {
"run-all":"npm-run-all remove:sh --parallel g:*",
"remove:sh":"rm -rf sh/*",
"g:activitycenter": "node activitycenter.js > sh/activitycenter.sh",
"g:common": "node common.js > sh/common.sh",
"g:coredns": "node coredns.js > sh/coredns.sh",
"g:dalong": "node dalong.js > sh/dalong.sh",
"g:demo-space": "node demo-space.js > sh/demo-space.sh",
"g:demoapp": "node demoapp.js > sh/demoapp.sh",
"g:droneci": "node droneci.js > sh/droneci.sh",
"g:formbuilder": "node formbuilder.js > sh/formbuilder.sh",
"g:gf-performance-bulletin": "node gf-performance-bulletin.js > sh/gf-performance-bulletin.sh",
"g:gitbase": "node gitbase.js > sh/gitbase.sh",
"g:graylog": "node graylog.js > sh/graylog.sh",
"g:ingress-nginx": "node ingress-nginx.js > sh/ingress-nginx.sh",
"g:itapiway": "node itapiway.js > sh/itapiway.sh",
"g:java": "node java.js > sh/java.sh",
"g:jenkins-docker": "node jenkins-docker.js > sh/jenkins-docker.sh",
"g:jenkins": "node jenkins.js > sh/jenkins.sh",
"g:jira": "node jira.js > sh/jira.sh"
}
说明:
我没生成的使用都是执行 yarn run-all 但是为了保证数据都是新的,每次都先删除老的shell,重新生成,同时对于生成
是并行的,可以快速帮助我们生成shell
├── README.md
├── code
│ ├── activitycenter.js
│ ├── app.js
│ ├── common.js
│ ├── coredns.js
│ ├── dalong.js
│ ├── demo-space.js
│ ├── demoapp.js
│ ├── droneci.js
│ ├── formbuilder.js
│ ├── gf-performance-bulletin.js
│ ├── gitbase.js
│ ├── graylog.js
│ ├── ingress-nginx.js
│ ├── itapiway.js
.......
│ ├── java.js
│ ├── jenkins-docker.js
│ ├── rhel7.js
│ ├── sh
│ │ ├── activitycenter.sh
│ │ ├── common.sh
│ │ ├── coredns.sh
│ │ ├── dalong.sh
│ │ ├── demo-space.sh
│ │ ├── demoapp.sh
......
│ │ ├── droneci.sh
│ │ ├── formbuilder.sh
│ │ ├── gf-performance-bulletin.sh
│ │ ├── gitbase.sh
│ │ ├── graylog.sh
│ │ ├── ingress-nginx.sh
│ └── yarn.lock
└── run.sh
#!/usr/bin/sh
for file in code/sh/*.sh; do
./$file
done
很简单,我们只需要执行 sh run.sh
就可以了,注意shell 脚本需要添加执行权限
对于用户、权限的额同步,以上没有列出来,但是我们也是可以调用rest api 处理的,而且上边的代码,部分是写死的,后边
找点时间重构下,搞成一个通用的工具,方便迁移
https://github.com/goharbor/harbor
https://github.com/mysticatea/npm-run-all
https://github.com/bitinn/node-fetch
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家详细介绍了Vue+ssh框架实现在线聊天,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章主要介绍了JavaScript事件流与委托,文章主要围绕JavaScript事件流与委托展开详细内容,需要的朋友可以参考一下,希望对你有所帮助
这篇文章主要介绍了jquery的方法属性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
所谓数据代理(也叫数据劫持),指的是在访问或者修改对象的某个属性时,通过一段代码拦截这个行为,进行额外的操作或者修改返回结果。比较典型的是 Object.defineProperty() 和 ES2015 中新增的 Proxy 对象
这篇文章主要介绍了Vue实现一种简单的无限循环滚动动画的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008