使用Makefile对多个shell命令进行编排

一、背景

在日常运维过程中,我们都会需要写大量的shell命令,如果是工程相对复杂的话,shell命令往往会封装为函数,交由主函数按需调用。

本文将引入Makefile来对复杂shell命令进行封装,让其变得易读易懂。

下面以一个构建Dockerfile的shell命令为示例

二、构建自定义docker镜像

1、编写你自己的Dockerfile

这里略去,不是本文的重点。

2、编写build.sh命令进行构建并推送镜像

bash 复制代码
IMAGE_BASE=xxx
IMAGE_NAME=user-service
IMAGE_VERSION=2.4.0

#构建本地docker镜像
docker build -t ${IMAGE_BASE}/${IMAGE_NAME}:${IMAGE_VERSION} .

#测试构建的docker镜像
#docker run -it --name ${IMAGE_NAME} -p 9033:9033 ${IMAGE_BASE}/${IMAGE_NAME}:${IMAGE_VERSION}

#对构建的docker镜像打标签
#docker tag ${IMAGE_BASE}/${IMAGE_NAME}:${IMAGE_VERSION} 192.168.5.6:8086/${IMAGE_BASE}/${IMAGE_NAME}:${IMAGE_VERSION}

#登录docker私有仓库
#docker login 192.168.5.6:8086 -u admin -p 123456

#推送本地构建的docker镜像到私有仓库
#docker push 192.168.5.6:8086/${IMAGE_BASE}/${IMAGE_NAME}:${IMAGE_VERSION}

可以看到,这里有许多注释,因为上述的shell命令并不是一次性先后执行的,而是在不同的阶段,执行不同的命令。

下面就把上面的shell命令改为Makefile。

3、Makefile

bash 复制代码
IMAGE_BASE=xxx
IMAGE_NAME=user-service
IMAGE_VERSION=2.4.0
# 默认执行build
all: build

#构建本地docker镜像
build:
        docker build -t ${IMAGE_BASE}/${IMAGE_NAME}:${IMAGE_VERSION} .

#测试构建的docker镜像
test:
        docker run -it --name ${IMAGE_NAME} -p 9033:9033 ${IMAGE_BASE}/${IMAGE_NAME}:${IMAGE_VERSION}

#对构建的docker镜像打标签
tag:
        docker tag ${IMAGE_BASE}/${IMAGE_NAME}:${IMAGE_VERSION} 192.168.5.6:8086/${IMAGE_BASE}/${IMAGE_NAME}:${IMAGE_VERSION}

#登录docker私有仓库
login:
        docker login 192.168.5.6:8086 -u admin -p 123456

#推送本地构建的docker镜像到私有仓库        
push:
        docker push 192.168.5.6:8086/${IMAGE_BASE}/${IMAGE_NAME}:${IMAGE_VERSION}

使用示例

  • make 与下面的make build一样
  • make build
  • make test 在未推送到仓库前,测试构建的本地镜像
  • make tag
  • make login 可能需要登录
  • make push

docker tag 给镜像打标签,见上一行

docker build 构建镜像,见下一行

Dockerfile和build.sh、Makefile存放在同一目录下。

当然,执行make命令也是在该目录下。

三、总结

编写Makefile文本的时候,注意每行命令前必须是TAB键,而非空格键。

由于本示例也存粹是对Makefile的入门,想要突出的是其对shell命令编排的使用好处。

相关推荐
云攀登者-望正茂31 分钟前
无缝部署您的应用程序:将 Jenkins Pipelines 与 ArgoCD 集成
运维·jenkins·argocd
wingaso1 小时前
[经验总结]删除gitlab仓库分支报错:错误:无法推送一些引用到“http:”
linux·数据仓库·git
独行soc1 小时前
2025年渗透测试面试题总结-阿里云[实习]阿里云安全-安全工程师(题目+回答)
linux·经验分享·安全·阿里云·面试·职场和发展·云计算
勤不了一点1 小时前
小白上手RPM包制作
linux·运维·服务器·软件工程
麦a~M了M3 小时前
ansible
linux·运维·ansible
2501_906314324 小时前
MCP-RAG 服务器:完整设置和使用指南
运维·服务器
QQ_4376643144 小时前
Linux下可执行程序的生成和运行详解(编译链接汇编图解)
linux·运维·c语言·汇编·caffe
搬码临时工4 小时前
远程连接电脑的方法?异地远程桌面连接和三方软件实现
运维·服务器·网络·物联网·电脑·远程工作
窦再兴4 小时前
来一个复古的技术FTP
linux·运维·服务器
梦在深巷、5 小时前
nginx配置之负载均衡
运维·nginx·负载均衡