最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用腳本一鍵打包并上傳docker鏡像的實(shí)現(xiàn)代碼

 更新時(shí)間:2021年02月25日 10:16:14   投稿:mrr  
這篇文章主要介紹了使用腳本一鍵打包并上傳docker鏡像的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

筆者搞了一年多微前端項(xiàng)目,一個(gè)團(tuán)隊(duì)管理十個(gè)微應(yīng)用,換成docker鏡像部署后,發(fā)布操作一下從原來的腳本直連服務(wù)器的1分鐘變成了幾十分鐘,尤其上傳每個(gè)應(yīng)用到各自的阿里云倉庫。這里就再寫個(gè)腳本一鍵打包docker鏡像并上傳阿里云。

本文只講怎么制作一個(gè)腳本幫助去減輕開發(fā)人員負(fù)擔(dān),關(guān)于docker-compose的配置見: 使用各種姿勢舒服的部署微前端項(xiàng)目(上:打包與上傳)

效果圖

直接上代碼

/**
 * @name docker鏡像打包上傳腳本
 * @author weilan
 * @time 2021.02.22
 */
const fs = require('fs');
const path = require('path');
const util = require('util');
const { log } = require('../utils/log');
const exec = util.promisify(require('child_process').exec);
const sub_app_ath = path.resolve();
let sub_apps = fs.readdirSync(sub_app_ath).filter(i => /^subapp|master/.test(i));
const inquirer = require('inquirer'); // 用于命令行交互

/**
 * @name 命令行交互配置項(xiàng)
 */
const question = [
 {
  type: 'confirm',
  name: 'dist',
  message: '是否需要打包前端靜態(tài)資源?',
 },
 {
  type: 'confirm',
  name: 'env',
  message: '請選擇是否需要打包成不聯(lián)網(wǎng)的內(nèi)網(wǎng)部署',
  when: function (answers) { // 當(dāng)answer為true的時(shí)候才會提問當(dāng)前問題
   return answers.dist
  }
 },
 {
  type: 'checkbox',
  name: 'apps',
  message: '請選擇要發(fā)布的模塊',
  choices: sub_apps,
  validate: function (val) {
   if (val.length) { // 校驗(yàn)
    return true;
   }
   return "選擇不能為空";
  }
 },
]

/**
 * @name 根據(jù)命令交互配置結(jié)果做邏輯處理
 */
inquirer.prompt(question).then(async (answer) => {
 let subApps = answer.apps;
 let buildScript = answer.env ? 'yarn build --Intranet' : 'yarn build';
 let needDist = answer.dist;
 let now = +new Date();
 // 登錄阿里云
 const { error: loginError } = await exec('docker login --username=哈哈哈 --password=嘿嘿 registry.cn-zhangjiakou.aliyuncs.com');
 if (loginError) {
  log.red(loginError, '登錄鏡像中心失敗')
  return;
 }
 console.log(`開始依次處理 ${JSON.stringify(subApps)} ......`);
 subApps.reduce((chain, item) => {
  return chain.then(() => publishIamge(item, now, needDist, buildScript))
 }, Promise.resolve())
});

/**
 * @name 打包鏡像并推送阿里云
 * @param {String} moduleName 模塊名
 * @param {String} now 當(dāng)前版本時(shí)間戳
 * @param {Boolean} needDist 是否需要打包前端靜態(tài)資源
 * @param {String} buildScript 前端靜態(tài)資源打包命令
 */
async function publishIamge(moduleName, now, needDist, buildScript) {
 // 打包前端靜態(tài)資源
 if (needDist) {
  console.log('開始打包前端靜態(tài)資源' + moduleName);
  const { error } = await exec(buildScript, { cwd: path.resolve(moduleName) });
  if (error) {
   log.red(moduleName, '前端代碼打包錯(cuò)誤:', error)
   return;
  }
  log.green(moduleName + '前端代碼打包成功')
 }
 // 打包鏡像
 console.log(`開始打包鏡像 ${moduleName} ......`);
 const { stdout: buildStdout, error: buildError } = await exec('docker-compose build ' + moduleName);
 if (buildError) {
  log.red(buildError, '鏡像打包錯(cuò)誤')
  return;
 }
 log.cyan(buildStdout)
 log.green('鏡像打包完成,開始制作鏡像標(biāo)簽')
 // 更新鏡像標(biāo)簽
 const imageName = 'ibp2fe_' + moduleName;
 const { error: tagError } = await exec(`docker tag ${imageName} registry.cn-zhangjiakou.aliyuncs.com/futureweb/${imageName}:${now}`);
 if (tagError) {
  log.red(tagError, '鏡像標(biāo)簽異常')
  return;
 }
 log.green('鏡像版本標(biāo)簽更新完畢,開始更新last標(biāo)簽')
 // 更新鏡像標(biāo)簽last版本
 const { error: tagLastError } = await exec(`docker tag ${imageName} registry.cn-zhangjiakou.aliyuncs.com/futureweb/${imageName}`);
 if (tagLastError) {
  log.red(tagError, '鏡像last標(biāo)簽異常')
  return;
 }
 log.green('鏡像last標(biāo)簽更新完畢,開始上傳')
 const { stdout: pushStdout, error: pushError } = await exec('docker push registry.cn-zhangjiakou.aliyuncs.com/futureweb/' + imageName);
 if (pushError) {
  log.red(pushError, '鏡像上傳失敗')
  return;
 }
 log.cyan(pushStdout)
 log.green('鏡像上傳成功')
}

process.on('unhandledRejection', (reason, p) => {
 console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
 // application specific logging, throwing an error, or other logic here
});

實(shí)現(xiàn)思路和注意事項(xiàng)

  • 首先考慮命令行交互的方式,將需要做的配置以選擇的方式讓開發(fā)人員確認(rèn),最后選擇要發(fā)布的模塊
  • 提前登錄阿里云賬號
  • 這里可以選擇并發(fā)執(zhí)行所選全部模塊,但是這樣日志輸出會無序,且電腦壓力極大會暫時(shí)死機(jī);因此這里我用依次處理的方式
  • 打包所選模塊的前端靜態(tài)資源
  • 執(zhí)行docker-compose build xxx 打包所選模塊鏡像

這里有個(gè)需要注意的點(diǎn),因?yàn)槭枪ぞ吆瘮?shù)處理,每個(gè)模塊的路徑由node讀取,因此你的模塊名和docker-compose.yml里的服務(wù)名、容器名最好都一致;另外注意你的鏡像打包后是你docker-compose.yml外的根目錄下劃線連接你的docker-compose服務(wù)名,因此你的阿里云鏡像倉庫命名最好和這個(gè)組合后鏡像名一致;以上都是為了方便工具函數(shù)能夠通用處理各個(gè)模塊鏡像。

  1. 制作鏡像標(biāo)簽。這里我會制作一個(gè)本次發(fā)布時(shí)間戳的版本和一個(gè)lastet版本,前面方便回退,后面方便運(yùn)維部署時(shí)無需關(guān)心標(biāo)簽版本。也可以拉取git tag來做鏡像的tag。
  2. 制作鏡像后上傳至阿里云鏡像中心

相關(guān)文章

  • docker部署springboot和vue項(xiàng)目的實(shí)現(xiàn)步驟

    docker部署springboot和vue項(xiàng)目的實(shí)現(xiàn)步驟

    本文主要介紹了docker部署springboot和vue項(xiàng)目的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • ubuntu如何查看docker容器占用的磁盤空間

    ubuntu如何查看docker容器占用的磁盤空間

    這篇文章主要介紹了ubuntu如何查看docker容器占用的磁盤空間問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Docker的核心及安裝的具體使用

    Docker的核心及安裝的具體使用

    這篇文章主要介紹了Docker的核心及安裝的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • docker?system?prune命令使用示例詳解

    docker?system?prune命令使用示例詳解

    docker system prune是一個(gè)用于清理Docker系統(tǒng)資源的命令,它用于刪除未使用的數(shù)據(jù)(如未使用的鏡像、容器、網(wǎng)絡(luò)和存儲卷)以釋放磁盤空間,下面這篇文章主要給大家介紹了關(guān)于docker?system?prune命令使用示例的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • Docker?compose一鍵安裝mirai搭建QQ機(jī)器人最快操作方法

    Docker?compose一鍵安裝mirai搭建QQ機(jī)器人最快操作方法

    這篇文章主要介紹了Docker?compose一鍵安裝mirai,搭建QQ機(jī)器人最快方法,詳細(xì)介紹了mirai基本操作,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • Docker打包及部署項(xiàng)目完整步驟

    Docker打包及部署項(xiàng)目完整步驟

    這篇文章主要給大家介紹了關(guān)于Docker打包及部署項(xiàng)目的相關(guān)資料,Docker是一種容器化技術(shù),可以將應(yīng)用程序及其依賴項(xiàng)打包成一個(gè)容器,方便在不同的環(huán)境中部署和運(yùn)行,需要的朋友可以參考下
    2023-08-08
  • docker如何部署帶有界面的registry倉庫

    docker如何部署帶有界面的registry倉庫

    這篇文章主要介紹了docker如何部署帶有界面的registry倉庫問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Docker中的容器網(wǎng)絡(luò)和通信原理詳解

    Docker中的容器網(wǎng)絡(luò)和通信原理詳解

    這篇文章主要介紹了Docker中的容器網(wǎng)絡(luò)和通信原理,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 如何解決IDEA無法連接docker中的數(shù)據(jù)庫的問題

    如何解決IDEA無法連接docker中的數(shù)據(jù)庫的問題

    這篇文章主要介紹了如何解決IDEA無法連接docker中的數(shù)據(jù)庫的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 在Docker容器中部署MSSQL

    在Docker容器中部署MSSQL

    這篇文章介紹了在Docker容器中部署MSSQL的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評論

陇南市| 古交市| 柘荣县| 宁南县| 卢龙县| 麻城市| 呼和浩特市| 德惠市| 北海市| 文山县| 临武县| 浦江县| 禄劝| 余江县| 江城| 柘荣县| 翼城县| 漳州市| 夏邑县| 化德县| 汤原县| 封丘县| 湖南省| 麻城市| 林西县| 康乐县| 吴堡县| 和硕县| 日土县| 赣州市| 宜君县| 阿坝县| 河曲县| 隆子县| 夏津县| 和田县| 舒城县| 棋牌| 瓮安县| 米易县| 寿阳县|