如何在Cloud Build中连接Cloud SQL执行knex数据库迁移?
问题根因
- 代理路径拼写错误:proxy-install步骤将Cloud SQL代理二进制文件下载到
/workspace/cloud_sql_proxy,Cloud Build所有步骤默认工作目录为/workspace,migrate步骤中错误写为./workspace/cloud_sql_proxy,实际解析为/workspace/workspace/cloud_sql_proxy,对应文件不存在,直接触发not found报错。 - 套接字路径不匹配:启动代理时指定socket存放目录为
/workspace,但knex默认读取Cloud SQL socket的路径为/cloudsql/<实例连接名>,路径不一致导致knex无法找到数据库连接套接字,抛出ENOENT连接错误。 - 环境镜像不统一:依赖安装使用
node:14.16.0镜像,后续步骤使用Cloud Build自带的yarn镜像,两个镜像的运行环境存在差异,也可能引发未知的运行异常。
修复方案
方案一(推荐,无需修改knex配置)
直接调整cloudbuild.yaml配置,统一运行环境、修正路径错误、匹配套接字目录:
steps: - name: 'node:14.16.0' entrypoint: 'yarn' id: yarn-install args: ['install'] waitFor: ["-"] - name: 'node:14.16.0' id: proxy-install entrypoint: sh args: - "-c" - "apt update && apt install -y wget && wget https://storage.googleapis.com/cloudsql-proxy/v1.23.0/cloud_sql_proxy.linux.amd64 -O /workspace/cloud_sql_proxy && chmod +x /workspace/cloud_sql_proxy" waitFor: ["-"] - id: migrate name: 'node:14.16.0' env: - NODE_ENV=$_NODE_ENV - DB_NAME=$_DB_NAME - DB_USER=$_DB_USER - DB_PASSWORD=MY_FAKE_PASSWORD - CLOUD_SQL_CONNECTION_NAME=$_CLOUD_SQL_CONNECTION_NAME entrypoint: sh args: - "-c" - "(mkdir -p /cloudsql && /workspace/cloud_sql_proxy -dir=/cloudsql -instances=$_CLOUD_SQL_CONNECTION_NAME & sleep 5) && yarn run knex migrate:latest" timeout: "1200s" waitFor: ["yarn-install", "proxy-install"]
说明:该方案将代理套接字存放目录改为knex默认读取的/cloudsql,提前创建对应目录即可,无需修改业务代码。
方案二(需同步修改knex配置)
如果不想调整代理的套接字目录,可同步修正两处配置:
- 修改migrate步骤的代理启动路径,将
./workspace/cloud_sql_proxy改为/workspace/cloud_sql_proxy - 调整knex配置文件中的数据库连接host,改为:
host: `/workspace/${process.env.CLOUD_SQL_CONNECTION_NAME}`
内容的提问来源于stack exchange,提问作者Roman Mahotskyi
相关产品推荐
相关产品推荐

