如何在Makefile中读取并使用.env文件中的环境变量?
解决方法
方法一:全局加载.env(推荐)
Make 默认不会自动读取项目下的.env文件,你需要在Makefile的最开头添加以下规则加载.env配置,加载后所有.env中定义的变量会自动成为Make的全局变量,同时会导出到所有规则的shell执行环境中:
# 加载.env配置,文件不存在时不报错 ifneq (,$(wildcard ./.env)) include .env export endif
加载完成后你原有规则里的${MYSQL_ROOT_PASSWORD}就可以正常读取到.env中的值。
方法二:单条规则局部加载
如果你不想把.env变量全局暴露给所有Make规则,可以只在需要用到的规则里手动source .env文件,注意shell变量的$符号需要加额外的$转义:
test-db: source .env && echo "create database dbname_test" | mysql -u root -h database -p$$MYSQL_ROOT_PASSWORD
配套解决连接报错
你收到的ERROR 2002报错是运行make命令的环境无法解析database主机名导致的:database是Docker内部网络的服务域名,只有在同Docker网络下的容器内才能访问,如果你是在容器外执行make命令,需要通过docker exec调用mysql容器内的客户端,规则修改如下:
test-db: docker compose exec -T database mysql -u root -p${MYSQL_ROOT_PASSWORD} -e "create database if not exists dbname_test"
- 添加
-T参数是为了禁用伪终端,避免非交互环境下执行报错 - 用
-e参数直接执行SQL语句,不需要管道传参,兼容性更好
注意事项
- Makefile中规则的命令行开头必须是Tab缩进,不能用空格,否则会报语法错误
- 如果你是在Docker容器内运行make命令,需要确认该容器和mysql容器加入了同一个Docker网络,并且可以正常解析
database域名
内容的提问来源于stack exchange,提问作者Mayor of the Plattenbaus
相关产品推荐
相关产品推荐

