婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > 使用腳本一鍵打包并上傳docker鏡像的實(shí)現(xiàn)代碼

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

熱門(mén)標(biāo)簽:南充電銷(xiāo)外呼系統(tǒng) 株洲電銷(xiāo) 宿州外呼系統(tǒng)公司 海外工廠地圖標(biāo)注 地圖標(biāo)注小程序 陜西辦理400電話 南昌外呼系統(tǒng)定制 貴陽(yáng)網(wǎng)絡(luò)外呼系統(tǒng)軟件 信陽(yáng)電銷(xiāo)外呼系統(tǒng)怎么樣

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

本文只講怎么制作一個(gè)腳本幫助去減輕開(kāi)發(fā)人員負(fù)擔(dān),關(guān)于docker-compose的配置見(jiàn): 使用各種姿勢(shì)舒服的部署微前端項(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: '請(qǐng)選擇是否需要打包成不聯(lián)網(wǎng)的內(nèi)網(wǎng)部署',
  when: function (answers) { // 當(dāng)answer為true的時(shí)候才會(huì)提問(wèn)當(dāng)前問(wèn)題
   return answers.dist
  }
 },
 {
  type: 'checkbox',
  name: 'apps',
  message: '請(qǐng)選擇要發(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(`開(kāi)始依次處理 ${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('開(kāi)始打包前端靜態(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(`開(kāi)始打包鏡像 ${moduleName} ......`);
 const { stdout: buildStdout, error: buildError } = await exec('docker-compose build ' + moduleName);
 if (buildError) {
  log.red(buildError, '鏡像打包錯(cuò)誤')
  return;
 }
 log.cyan(buildStdout)
 log.green('鏡像打包完成,開(kāi)始制作鏡像標(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)簽更新完畢,開(kāi)始更新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)簽更新完畢,開(kāi)始上傳')
 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)

  • 首先考慮命令行交互的方式,將需要做的配置以選擇的方式讓開(kāi)發(fā)人員確認(rèn),最后選擇要發(fā)布的模塊
  • 提前登錄阿里云賬號(hào)
  • 這里可以選擇并發(fā)執(zhí)行所選全部模塊,但是這樣日志輸出會(huì)無(wú)序,且電腦壓力極大會(huì)暫時(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ù)名,因此你的阿里云鏡像倉(cāng)庫(kù)命名最好和這個(gè)組合后鏡像名一致;以上都是為了方便工具函數(shù)能夠通用處理各個(gè)模塊鏡像。

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

標(biāo)簽:汕頭 晉城 玉林 拉薩 開(kāi)封 鄭州 三明 石嘴山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《使用腳本一鍵打包并上傳docker鏡像的實(shí)現(xiàn)代碼》,本文關(guān)鍵詞  使用,腳本,一鍵,打包,并,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《使用腳本一鍵打包并上傳docker鏡像的實(shí)現(xiàn)代碼》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于使用腳本一鍵打包并上傳docker鏡像的實(shí)現(xiàn)代碼的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产亚洲欧洲一区高清在线观看| 色综合久久中文字幕| 成人黄色免费短视频| 日韩一区二区三区观看| 污片在线观看一区二区| 在线中文字幕一区二区| 亚洲色图视频网站| 粉嫩aⅴ一区二区三区四区| 2023国产精品| 国产另类ts人妖一区二区| 26uuu久久天堂性欧美| 国产中文一区二区三区| 久久久91精品国产一区二区精品| 激情丁香综合五月| 精品乱人伦一区二区三区| 蜜桃av一区二区在线观看| 欧美一区二区不卡视频| 久久超碰97人人做人人爱| 日韩欧美成人午夜| 国产一区二区三区高清播放| 国产蜜臀av在线一区二区三区| 成人丝袜高跟foot| 亚洲欧洲成人精品av97| 欧美性色aⅴ视频一区日韩精品| 亚洲一级二级三级在线免费观看| 在线观看日韩av先锋影音电影院| 亚洲成人激情自拍| 欧美草草影院在线视频| 国产精品456露脸| 日韩一区欧美小说| 欧美日韩国产天堂| 久久精品72免费观看| 久久久精品影视| 99精品桃花视频在线观看| 一区二区在线观看免费视频播放| 4438x成人网最大色成网站| 九色综合国产一区二区三区| 中文字幕精品在线不卡| 色猫猫国产区一区二在线视频| 午夜国产不卡在线观看视频| 欧美刺激午夜性久久久久久久| 成人一二三区视频| 午夜精品爽啪视频| 国产亚洲制服色| 在线看不卡av| 国产麻豆精品在线| 一区二区三区中文字幕| 日韩欧美综合一区| 99国产精品久久久久久久久久| 石原莉奈在线亚洲二区| 久久精品视频网| 精品视频1区2区| 风间由美一区二区三区在线观看| 亚洲第一在线综合网站| 中文字幕欧美区| 欧美一区二区私人影院日本| a在线欧美一区| 麻豆传媒一区二区三区| 亚洲蜜臀av乱码久久精品蜜桃| 91精品国产高清一区二区三区蜜臀| 成人午夜视频网站| 美女被吸乳得到大胸91| 国产精品国产精品国产专区不蜜| 欧美一区二区三区电影| 色偷偷88欧美精品久久久| 国产精品综合视频| 日韩电影在线看| 亚洲激情自拍视频| 久久精品视频免费| 日韩一区二区麻豆国产| 91国偷自产一区二区三区观看| 国产一区二区三区最好精华液| 午夜精品久久久久| 亚洲色图制服诱惑| 国产精品热久久久久夜色精品三区| 日韩欧美一区中文| 欧美精品久久99久久在免费线| 91视频一区二区| 国产精品夜夜嗨| 久久99久久99| 蜜臀av一级做a爰片久久| 亚洲一区二区精品视频| 亚洲精品欧美在线| 国产精品欧美综合在线| 精品电影一区二区三区| 91精品国产欧美一区二区成人| 欧美四级电影网| 在线视频你懂得一区| 色婷婷精品大在线视频| av高清久久久| 成人av在线资源网站| 91色婷婷久久久久合中文| 成人精品高清在线| 国产成人精品亚洲午夜麻豆| 国产精品资源网站| 国产精品自产自拍| 国产大陆a不卡| 国产成人精品免费一区二区| 国产乱子伦视频一区二区三区 | 中文字幕av一区二区三区免费看| 精品美女一区二区| 精品粉嫩超白一线天av| 久久综合av免费| 26uuu国产电影一区二区| 日韩三级高清在线| 日韩一区二区免费在线电影| 欧美性生活一区| 欧美老肥妇做.爰bbww| 欧美一区二区三区在线看| 日韩欧美国产综合一区 | 国产三级一区二区| 欧美韩国一区二区| 最新久久zyz资源站| 亚洲精品综合在线| 亚洲h动漫在线| 精品一区二区三区的国产在线播放 | 亚洲免费视频中文字幕| 一区二区在线观看免费| 亚洲一区二区三区在线看| 日韩中文字幕亚洲一区二区va在线| 调教+趴+乳夹+国产+精品| 美国十次综合导航| 国产精品18久久久| 色婷婷久久久久swag精品| 欧美日韩视频专区在线播放| 欧美精品日韩精品| 精品国产91久久久久久久妲己| 国产午夜一区二区三区| 中文字幕日本不卡| 日韩综合小视频| 国产91精品久久久久久久网曝门| 99久久精品久久久久久清纯| 欧美日韩成人综合天天影院| 26uuu亚洲综合色欧美| 成人免费视频在线观看| 视频精品一区二区| 成人永久aaa| 欧美日韩免费不卡视频一区二区三区| 欧美一区二区三区婷婷月色| 久久精品一二三| 亚洲综合成人网| 精品亚洲成a人在线观看| 99精品视频在线观看| 91精品国产综合久久久久久| 国产欧美日韩在线视频| 夜夜夜精品看看| 国产一区二三区| 欧美午夜不卡视频| 欧美激情一区在线| 视频一区二区中文字幕| 成人99免费视频| 日韩一区二区三区在线| 亚洲日韩欧美一区二区在线| 狠狠色狠狠色综合日日91app| 91国偷自产一区二区三区观看 | 日本久久电影网| 欧美va在线播放| 亚洲图片欧美综合| 成人理论电影网| 欧美电影免费观看高清完整版 | 亚洲另类一区二区| 激情综合一区二区三区| 欧美日韩国产123区| 中文字幕一区在线| 一个色综合av| 日韩电影免费在线看| 国产精品国产三级国产普通话蜜臀 | 国产精品自拍一区| 成人欧美一区二区三区白人| 欧美网站一区二区| 国产主播一区二区三区| 一区二区在线观看免费| 久久人人爽爽爽人久久久| 99麻豆久久久国产精品免费 | 毛片av一区二区三区| 国产精品少妇自拍| 91精品在线免费| 免费成人在线视频观看| 国产精品精品国产色婷婷| 精品视频在线免费| 国产999精品久久| 日韩电影免费在线看| 久久久777精品电影网影网| 欧美三级在线视频| 成人av在线一区二区三区| 奇米一区二区三区| 国产免费成人在线视频| 欧美tickling网站挠脚心| 91浏览器打开| 国产大陆亚洲精品国产| 蜜芽一区二区三区| 国产欧美综合在线观看第十页 | 欧美刺激脚交jootjob| 99久久久无码国产精品| 国产一区二区三区在线观看精品| 亚洲二区在线视频| 亚洲美女电影在线| 亚洲视频你懂的| 国产精品无遮挡| 久久精品男人天堂av|