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

相关推荐
hweiyu0025 分钟前
Linux运维实战:云原生设计与实施Docker&K8S(视频教程)
linux·运维·云原生
blackorbird27 分钟前
使用 Overpass Turbo 查找监控摄像头
运维·服务器·数据库·windows
海棠蚀omo37 分钟前
Linux操作系统-命令行参数及环境变量
linux·操作系统
小白不想白a1 小时前
【shell】每日shell练习(系统用户安全审计/系统日志错误分析)
linux·运维·云原生
码猫Mrr1 小时前
创维E900V22D刷入armbian hdmi开机花屏和网络无法使用 解决方式【亲测】
linux·armbian·e900v22d
SelectDB技术团队1 小时前
Apache Doris 与 ClickHouse:运维与开源闭源对比
运维·clickhouse·apache
YongCheng_Liang1 小时前
Oracle数据库基本命令的8个模块
运维·数据库·oracle
Cx330❀1 小时前
《Linux基础入门指令(二)》:从零开始理解Linux系统
linux·运维·服务器·网络·经验分享
武文斌772 小时前
项目学习总结:CAN总线、摄像头、STM32概述
linux·arm开发·stm32·单片机·嵌入式硬件·学习·c#
JAVA学习通2 小时前
零基础OSS组件(Java)
java·linux·leetcode