使用脚本一键打包并上传docker镜像的实现代码

 更新时间:2021年02月25日 10:16:14   投稿:mrr  
这篇文章主要介绍了使用脚本一键打包并上传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服务名,因此你的阿里云镜像仓库命名最好和这个组合后镜像名一致;以上都是为了方便工具函数能够通用处理各个模块镜像。

  1. 制作镜像标签。这里我会制作一个本次发布时间戳的版本和一个lastet版本,前面方便回退,后面方便运维部署时无需关心标签版本。也可以拉取git tag来做镜像的tag。
  2. 制作镜像后上传至阿里云镜像中心

相关文章

  • Docker容器如何查看ip地址的实现方法

    Docker容器如何查看ip地址的实现方法

    这篇文章主要介绍了Docker容器如何查看ip地址的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • docker安装java环境的实现步骤

    docker安装java环境的实现步骤

    这篇文章主要介绍了docker安装java环境的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • docker 拉取镜像出错的问题解决

    docker 拉取镜像出错的问题解决

    当Docker拉取镜像遇到网络错误时,通常是因为镜像源无法访问,解决此问题可通过修改Docker的配置文件/etc/docker/daemon.json,设置一个可用的镜像加速地址,修改后重新加载配置并重启Docker服务即可,这样可以提高拉取速度和成功率,避免因网络问题导致的镜像拉取失败
    2024-10-10
  • 使用docker部署php服务的详细步骤

    使用docker部署php服务的详细步骤

    Docker镜像是一个可移植的、自包含的单元,其中包含了运行应用程序所需的所有文件、配置和依赖项,当使用Docker部署PHP应用程序时,可以将PHP应用程序和其依赖项打包到一个称为Docker镜像的独立容器中,北本文介绍了使用docker部署php服务的详细步骤,需要的朋友可以参考下
    2024-03-03
  • mac通过docker一键部署Nexus3的过程记录

    mac通过docker一键部署Nexus3的过程记录

    编写一些简易的 shell 脚本帮我们快速的搭建服务器,猿们只要按着套路“一步一步”的操作,基本上都可以快速部署服务,这篇文章主要介绍了mac通过docker一键部署Nexus3及安装步骤,需要的朋友可以参考下
    2022-10-10
  • 如何查看docker-compose.yml所在位置

    如何查看docker-compose.yml所在位置

    这篇文章主要介绍了如何查看docker-compose.yml所在位置问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • ubuntu vps安装docker报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock.问题解决

    ubuntu vps安装docker报错:Cannot connect to t

    这篇文章主要介绍了解决ubuntu vps安装docker时报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock.问题的相关资料,文中介绍非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-04-04
  • docker-swarm之使用Docker secret管理敏感数据

    docker-swarm之使用Docker secret管理敏感数据

    就Docker Swarm集群服务而言,secret 是块状数据,例如密码、SSH私钥、SSL证书或其他不应通过网络传输或未加密存储在Dockerfile或应用程序源代码中的数据,我们可以使用Docker secret 集中管理这些数据,所以接下来就带大家了解一下如何使用Docker secret 管理敏感数据
    2023-08-08
  • 给docker配置指定ip的超详细图解

    给docker配置指定ip的超详细图解

    这篇文章主要给大家介绍了关于给docker配置指定ip的超详细图解教程,Docker容器的IP地址由Docker守护进程动态分配,默认情况下,它使用的是宿主机的IP地址,但是在某些情况下,您可能需要为Docker容器指定静态IP地址,需要的朋友可以参考下
    2023-09-09
  • 清理docker磁盘空间的方法总结(附详细讲解)

    清理docker磁盘空间的方法总结(附详细讲解)

    docker 镜像特别容易占空间,稍微不注意可能磁盘爆满,所以本文给大家详细介绍了如何清理 docker 磁盘空间,并通过代码示例给大家讲解的非常详细,需要的朋友可以参考下
    2024-02-02

最新评论