老瓶装新酒--使用makefile优化你的工作流
文章目录
前言
Makefile
主要出现在c/c++
的项目居多,用来管理c/c++
的编译依赖。
这里的用法有点非主流的感觉,但是经过本人的实践。用好Makefile
可以事半功倍。
一、演示创建一个docker容器的过程
这里只是为了演示工作流程,所以对docker
命令的介绍会一带而过。
下面给一个微服务,做个docker镜像。并启动这个容器。
1.准备一个虚拟的服务
- 编译命令
|
|
- 源码 你可以看到这个虚拟服务只是打印一句话就退出,这个虚拟服务替换成你的业务服务
|
|
2.创建docker镜像
alpine
是docker里面比较mini的镜像,大约4MB
左右,特别适合把服务拆得很散。
ubuntu
镜像占100-200MB
的样子。来个7-8个微服务。啥也不干,第一次pull 1G空间都没了。
如果docker registry和项目开发不在一个网段,中间使用外网通信。上传,下载的时间也相当可观。
使用alpine
大约可以节省10x
等待时间。
|
|
FROM
使用alpine:3.7
基础镜像构建自己的镜像RUN
运行shell命令COPY
本地文件拷贝到镜像里面WORKDIR
设置镜像工作目录,下面的CMD
命令都没有使用绝对路径/opt/service
就可以执行start.sh
命令, 就是这个指令的作用CMD
类似编程语言的main
函数。入口指令
3. start.sh
内容
使用start.sh
包裹服务启动脚本,是为了把经常变的部分放到start.sh
里面。不变的部分放到Dockerfile
里面维护。
debug
的时候,就发现这个方式比CMD直接放启动命令好多了。
|
|
4.编译容器
|
|
5.运行容器
|
|
6.删除容器
没问题,就不同删除容器
|
|
7.删除镜像
没问题,就不同删除镜像
|
|
二、优化工作流
如果上面的脚本一遍过,基本也不需要优化工作流,如果一次不成功,遇到疑难杂症。来来回回几次
(删除,创建,运行)。
就要吐了。 遇到这种情况,大家第一个反应是使用bash
优化流程。先来个switch case
骨架代码,他接受不同参数,运行不同子命令
|
|
- 运行
|
|
好了,把上面的docker命令,移动到 workflow.sh脚步里面,加速工作流
三、优化工作流
如果你对第二步已经满足就不用看第三步。第二步要写switch case
骨架代码。有没有一种方式,原生支持多入口子命令执行。答:Makefile
ok。现在使用Makefile重构上面的shell脚本。
|
|
- 运行
|
|
Makefile
不仅完成第二步内容,还支持命令组合。比如上面的reset.docker
命令,就是先执行clean.docker
后执行build.docker
当然,这里为了演示使用workflow.make
文件名,如果使用默认Makefile
文件名是不需要make -f
指定Makefile
脚本文件,直接make build
就可以。
github 源码位置
https://github.com/guonaihong/go-example/tree/main/docker-alpine
文章作者 guonaihong
上次更新 2021-01-20