Google Cloud Build执行数据库迁移时报ENOTFOUND错误如何解决
报错诱因与解决方案
报错诱因
你遇到的getaddrinfo ENOTFOUND错误核心原因是配置字段使用错误:
- Sequelize的MySQL连接逻辑中,
host参数仅用于TCP连接的域名/IP解析,你将Cloud SQL代理生成的Unix套接字路径填写到了host字段,Sequelize会尝试对该路径字符串做DNS解析,自然无法找到对应地址。 - Cloud SQL代理在你指定的
/workspace目录下生成的是Unix套接字文件,走本地文件通信,不需要走TCP域名解析逻辑,需要使用专门的套接字配置字段。
解决步骤
- 修改Sequelize数据库配置
将config/config.js中的host字段替换为socketPath字段,明确指定Unix套接字连接:
module.exports = { production: { username: process.env.PROD_DB_USERNAME, password: process.env.PROD_DB_PASSWORD, database: process.env.PROD_DB_NAME, dialect: 'mysql', // 替换原host字段,指定Unix套接字路径 socketPath: `/workspace/${process.env.INSTANCE_CONNECTION_NAME}`, // 补充dialectOptions配置,适配底层MySQL驱动的套接字识别逻辑 dialectOptions: { socketPath: `/workspace/${process.env.INSTANCE_CONNECTION_NAME}` } } }
- 核对环境变量配置
确认Cloud Build触发器的环境变量中已经正确配置INSTANCE_CONNECTION_NAME,取值为你的Cloud SQL实例完整连接名(格式为项目ID:区域:实例名),需和代理启动命令中填写的<MY-INSTANCE-NAME>完全一致。 - 可选:优化代理启动参数
由于你已经为Cloud SQL实例开启了公网IP,可以在代理启动命令中添加公网优先级参数,避免代理优先尝试私网连接导致的超时问题,将cloudbuild.yaml中migrate步骤的args参数调整为:
args: - "-c" - "(/workspace/cloud_sql_proxy -dir=/workspace -instances=<MY-INSTANCE-NAME> -ip_address_types=PUBLIC & sleep 2) && ./node_modules/.bin/sequelize db:migrate"
注意:后续将应用部署到Cloud Run运行时,Cloud SQL默认的套接字路径为
/cloudsql/[实例连接名],需要将运行时的socketPath配置同步修改为对应路径,不要和Cloud Build环节的/workspace路径混淆。
内容的提问来源于stack exchange,提问作者pthesling
相关产品推荐
相关产品推荐

