一、背景
在日常运维过程中,我们都会需要写大量的shell命令,如果是工程相对复杂的话,shell命令往往会封装为函数,交由主函数按需调用。
本文将引入Makefile来对复杂shell命令进行封装,让其变得易读易懂。
下面以一个构建Dockerfile的shell命令为示例
二、构建自定义docker镜像
1、编写你自己的Dockerfile
这里略去,不是本文的重点。
2、编写build.sh命令进行构建并推送镜像
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
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命令编排的使用好处。