目前所在项目使用了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 等命令,都是避免不了一堆的前缀,
即使有命令补全,历史搜索辅助插件,但还是会让人不爽,并且也容易输错
缩短命令,方便记忆,减少出错,提高工具的复用率
针对命令太长,容易出错的
首先想到缩短命令可以使用alias, 这个可以轻松实现,但也会存在一些问题:
alias的命名不太容易参考很多开源项目,都是用到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细节
参考这里