使用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命令编排的使用好处。

相关推荐
kymjs张涛7 小时前
OpenClaw 学习小组:初识
android·linux·人工智能
程序设计实验室9 小时前
经历分享,发现挖矿木马后,服务器快速备份与重装(腾讯云平台)
linux
Miku1611 小时前
OpenClaw-Linux+飞书官方Plugin安装指南
linux·人工智能·agent
Miku1611 小时前
OpenClaw 接入 QQ Bot 完整实践指南
linux·人工智能·agent
Yogurt_cry16 小时前
[树莓派4B] 闲置近10年的爱普生 L310 打印机爆改无线打印机
linux·物联网·树莓派
爱吃橘子橙子柚子1 天前
3CPU性能排查总结(超详细)【Linux性能优化】
运维·cpu
Johny_Zhao2 天前
OpenClaw中级到高级教程
linux·人工智能·信息安全·kubernetes·云计算·yum源·系统运维·openclaw
Sheffield2 天前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
Sheffield3 天前
Alpine是什么,为什么是Docker首选?
linux·docker·容器
马艳泽3 天前
win10下运行Start Broker and Proxy报错解决
docker