1 背景
目前所在项目使用了docker-compose
来构建,并且需要在同一个机器上部署两套环境(留下了没有CI的眼泪)
通过查阅资料,了解到可以使用-p
命令来指定项目名称,并且通过环境变量的方式动态修改端口和网络
最终是顺利完成了任务,但是产生一个问题,就是启动应用命令特别的长。
比如:
要启动测试环境的服务和重启nginx容器
export TAG=v1.4.4; docker-compose -f docker-compose-base.yml -f docker-compose-test.yml --env-file $HOME/.env-memory-test --project-name memory-test-project up -d --build --remove-orphans
docker-compose -f docker-compose-base.yml -f docker-compose-test.yml --env-file $HOME/.env-memory-test --project-name memory-test-project restart nginx
启动应用命令的意思是:
- 设置一个环境变量,
TAG=v1.4.4
,这个docker-compose
中会使用到 -
-f
指定docker-compose
文件,可以使用多个,最终会合并 -
--env-file
指定启动的环境变量 -
--project-name
指定项目名称,但项目时可以省略,简短写法是-p
-
up
启动docker-compose
中所有的service
-
-d
已daemon
的方式运行 -
--build
启动之前先构建镜像 -
--remove-orphans
移除掉那些不在docker-compose
中的service
, 在docker-compose
的service
有变动时候会有用
要使用restart
, ps
, logs
, down
等命令,都是避免不了一堆的前缀,
即使有命令补全,历史搜索辅助插件,但还是会让人不爽,并且也容易输错
2 目的
缩短命令,方便记忆,减少出错,提高工具的复用率
3 做法
针对命令太长,容易出错的
首先想到缩短命令可以使用alias
, 这个可以轻松实现,但也会存在一些问题:
-
alias
的命名不太容易 - 适配多环境,多参数,实现起来有点麻烦
- 在不同的shell环境或者不同用户都要配置
- 其他项目不容易复用这个能力
参考很多开源项目,都是用到Makefile
,不妨我也来试试
先看结果,背景中提到很长的命令,通过Makefile
可以缩短成make up-tag tag=v1.4.4
这样就非常的简短,方便记忆
看看这个Makefile
长成什么样
# Makefile
# 伪目标,避免文件和目标相同时,避免目标无法执行,
.PHONY: up logs up-tag down build build-tag ps config exec restart
# 取变量
env := ${env}
ifeq ($(env), prod)
# 只有明确指定了env=prod,才走这里
project_name = memory-prod-project
docker-compose-file = docker-compose-prod.yml
env-file = ${HOME}/.env-memory-prod
else
# 否则,env不传或者等于其他,全部走这里
project_name = memory-test-project
docker-compose-file = docker-compose-test.yml
env-file = ${HOME}/.env-memory-test
endif
cmd = docker-compose -f docker-compose-base.yml -f $(docker-compose-file) --env-file $(env-file) --project-name $(project_name)
tag := $(tag)
# 目标
up-tag:
# export环境变量需要和docker-compose写在同一个行,否则两个进程执行,环境变量会无效
export TAG=$(tag); $(cmd) up -d --build --remove-orphans
# 启动完应用容器后,需要重启nginx,否则upstream会失败
$(cmd) restart nginx
更多Makefile
细节
参考这里
网友评论