1. <i id="s6b2k"><small id="s6b2k"></small></i>
    <b id="s6b2k"><bdo id="s6b2k"></bdo></b>
  2. <wbr id="s6b2k"></wbr>

    使用腳本一鍵打包并上傳docker鏡像的實現代碼_docker

    來源:腳本之家  責任編輯:小易  

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

    本文只講怎么制作一個腳本幫助去減輕開發人員負擔,關于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 命令行交互配置項
     */
    const question = [
     {
      type: 'confirm',
      name: 'dist',
      message: '是否需要打包前端靜態資源?',
     },
     {
      type: 'confirm',
      name: 'env',
      message: '請選擇是否需要打包成不聯網的內網部署',
      when: function (answers) { // 當answer為true的時候才會提問當前問題
       return answers.dist
      }
     },
     {
      type: 'checkbox',
      name: 'apps',
      message: '請選擇要發布的模塊',
      choices: sub_apps,
      validate: function (val) {
       if (val.length) { // 校驗
        return true;
       }
       return "選擇不能為空";
      }
     },
    ]
    
    /**
     * @name 根據命令交互配置結果做邏輯處理
     */
    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 當前版本時間戳
     * @param {Boolean} needDist 是否需要打包前端靜態資源
     * @param {String} buildScript 前端靜態資源打包命令
     */
    async function publishIamge(moduleName, now, needDist, buildScript) {
     // 打包前端靜態資源
     if (needDist) {
      console.log('開始打包前端靜態資源' + moduleName);
      const { error } = await exec(buildScript, { cwd: path.resolve(moduleName) });
      if (error) {
       log.red(moduleName, '前端代碼打包錯誤:', error)
       return;
      }
      log.green(moduleName + '前端代碼打包成功')
     }
     // 打包鏡像
     console.log(`開始打包鏡像 ${moduleName} ......`);
     const { stdout: buildStdout, error: buildError } = await exec('docker-compose build ' + moduleName);
     if (buildError) {
      log.red(buildError, '鏡像打包錯誤')
      return;
     }
     log.cyan(buildStdout)
     log.green('鏡像打包完成,開始制作鏡像標簽')
     // 更新鏡像標簽
     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, '鏡像標簽異常')
      return;
     }
     log.green('鏡像版本標簽更新完畢,開始更新last標簽')
     // 更新鏡像標簽last版本
     const { error: tagLastError } = await exec(`docker tag ${imageName} registry.cn-zhangjiakou.aliyuncs.com/futureweb/${imageName}`);
     if (tagLastError) {
      log.red(tagError, '鏡像last標簽異常')
      return;
     }
     log.green('鏡像last標簽更新完畢,開始上傳')
     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
    });

    實現思路和注意事項

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

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

      制作鏡像標簽。這里我會制作一個本次發布時間戳的版本和一個lastet版本,前面方便回退,后面方便運維部署時無需關心標簽版本。也可以拉取git tag來做鏡像的tag。 制作鏡像后上傳至阿里云鏡像中心
    您可能感興趣的文章:Docker打包鏡像及修改配置的實現本地使用docker打包部署鏡像的方法docker 打包本地鏡像,并到其他機器進行恢復操作詳解如何使用Docker部署一個web項目并打包成鏡像文件使用jib打包docker鏡像實戰詳解Docker 容器基礎系統鏡像打包

  3. 本文相關:
  4. docker高級教程之智能添加與修改防火墻規則
  5. docker中安裝quagga詳細介紹
  6. docker容器間跨宿主機通信-基于overlay的實現方法
  7. docker 搭建私有倉庫(registry、harbor)
  8. 簡述docker安裝tomcat鏡像并部署web項目
  9. docker部署rabbitmq容器實現過程解析
  10. 詳解如何使用docker部署django+mysql8開發環境
  11. 總結docker不適合部署數據庫的7大原因
  12. 詳解centos7用阿里云docker yum源在線安裝docker 17.03.2
  13. ubuntu 16.04中docker的安裝和代理配置教程
  14. 程序使用到動態庫,如何打包程序的docker鏡像
  15. 如何將應用打包成為 Docker 鏡像
  16. docker-java如何將本地上傳的鏡像包重新打包并push...
  17. 如何把java 應用 制作成docker鏡像
  18. 怎么制作docker鏡像并上傳
  19. 如何使用docker+jenkins實現自動化集成
  20. 怎么python 打包docker鏡像
  21. 怎么把spring boot打包成鏡像部署到docker
  22. docker 怎么上傳自己的鏡像到自己的docker hub報錯
  23. 如何提交docker鏡像到DockerHub
  24. 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全dockerhyper-vvmwarevirtualboxxenserverkvmqemuopenvzxencloudstackopenstack云計算技術云其它首頁服務器云和虛擬化dockerdocker打包鏡像及修改配置的實現本地使用docker打包部署鏡像的方法docker 打包本地鏡像,并到其他機器進行恢復操作詳解如何使用docker部署一個web項目并打包成鏡像文件使用jib打包docker鏡像實戰詳解docker 容器基礎系統鏡像打包docker高級教程之智能添加與修改防火墻規則docker中安裝quagga詳細介紹docker容器間跨宿主機通信-基于overlay的實現方法docker 搭建私有倉庫(registry、harbor)簡述docker安裝tomcat鏡像并部署web項目docker部署rabbitmq容器實現過程解析詳解如何使用docker部署django+mysql8開發環境總結docker不適合部署數據庫的7大原因詳解centos7用阿里云docker yum源在線安裝docker 17.03.2ubuntu 16.04中docker的安裝和代理配置教程docker 給運行中的容器設置端口映docker獲取鏡像報錯docker: errodocker.service啟動失敗:unit ndocker 清理命令集錦淺談docker-compose網絡設置之neubuntu14.04+docker的安裝及使用docker容器如何優雅的終止詳解docker容器訪問宿主機網絡的方法詳解如何使用docker部署一個web項詳解docker國內鏡像拉取和鏡像加docker 實現在線集成開發環境實例詳解centos6使用docker部署kafka項目的方法分阿里云docker容器固定應用到到某一個節點docker nginx容器制作部署實現方法centos 下docker 安裝方法使用tls加密通訊遠程連接docker的示例詳解基于dockerfile創建zabbix監控體系代碼實docker swarm 集群故障與異常詳解docker構建maven+tomcat基礎鏡像的實現docker 數據卷之進階篇
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.yu113.com All Rights Reserved
    战天txt全集下载