You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:45:10