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

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

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),玄武企業(yè)網(wǎng)站建設(shè),玄武品牌網(wǎng)站建設(shè),網(wǎng)站定制,玄武網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,玄武網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

本文只講怎么制作一個(gè)腳本幫助去減輕開發(fā)人員負(fù)擔(dān),關(guān)于docker-compose的配置見:

效果圖直接上代碼/** * @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ì)提問當(dāng)前問題 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(`開始依次處理 ${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ā)布的模塊 提前登錄阿里云賬號(hào) 這里可以選擇并發(fā)執(zhí)行所選全部模塊,但是這樣日志輸出會(huì)無序,且電腦壓力極大會(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ù)名,因此你的阿里云鏡像倉庫命名最好和這個(gè)組合后鏡像名一致;以上都是為了方便工具函數(shù)能夠通用處理各個(gè)模塊鏡像。

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

網(wǎng)站標(biāo)題:使用腳本一鍵打包并上傳docker鏡像的實(shí)現(xiàn)代碼
URL鏈接:http://www.muchs.cn/article42/ihec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)營(yíng)銷型網(wǎng)站建設(shè)、建站公司、網(wǎng)站導(dǎo)航、ChatGPT、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)