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

相关推荐
tonngw1 小时前
【Mac 从 0 到 1 保姆级配置教程 16】- Docker 快速安装配置、常用命令以及实际项目演示
macos·docker·容器·开源·github·docker desktop·orbstack
debug 小菜鸟4 小时前
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
docker·云计算·aws
SpikeKing4 小时前
Server - 使用 Docker 配置 PyTorch 研发环境
pytorch·docker·llm
地衣君4 小时前
RISC-V 开发板 + Ubuntu 23.04 部署 open_vins 过程
linux·ubuntu·risc-v
5:004 小时前
云备份项目
linux·开发语言·c++
码农101号5 小时前
Linux中shell编程表达式和数组讲解
linux·运维·服务器
powerfulzyh5 小时前
非Root用户启动SSH服务经验小结
运维·ssh
云道轩5 小时前
升级centos 7.9内核到 5.4.x
linux·运维·centos
是小满满满满吗5 小时前
传输层:udp与tcp协议
linux·服务器·网络
斯普信云原生组5 小时前
Docker构建自定义的镜像
java·spring cloud·docker