You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Docker部署Google Cloud SQL代理遭遇连接拒绝错误

Hey,我来帮你捋捋Cloud SQL Proxy容器连接被拒绝的问题,结合你给出的docker-compose片段,咱们从几个常见的排查方向入手:

排查Cloud SQL Proxy连接拒绝问题

1. 补全凭证文件的配置细节

你给出的命令里-credential_file=/config/cr...明显是截断了,这大概率是问题源头之一:

  • 首先要把GCP服务账号的JSON密钥文件挂载到proxy容器里,在docker-compose的cloudsql-proxy服务下加volumes映射:
    volumes:
      - ./本地密钥文件路径/service-account-key.json:/config/service-account-key.json
    
  • 命令里的-credential_file路径要和挂载路径完全一致,不能省略,比如应该是-credential_file=/config/service-account-key.json

2. 验证Cloud SQL实例ID的完整格式

你用的XXX需要是GCP要求的完整实例ID格式:GCP项目ID:实例区域:实例名称,比如my-gcp-project:us-central1:my-sql-instance,格式不对的话proxy根本找不到对应的实例。

3. 确认服务账号的权限

别忘了给你用的服务账号分配Cloud SQL Client角色(或者更精细的Cloud SQL Instance User权限),没有权限的话proxy连不上Cloud SQL实例。

4. 检查容器间的网络互通

  • 你的应用容器和cloudsql-proxy容器要在同一个Docker网络里,docker-compose默认会给所有服务创建一个自定义网络,没问题,但如果是外部容器,得手动加入这个网络。
  • 应用容器连接数据库时,要写cloudsql-proxy:3306而不是localhost:3306——每个容器的localhost都是自己的独立环境,跨容器访问得用服务名。

5. 查看proxy容器的日志定位问题

先单独启动proxy容器,看看日志输出,能直接拿到错误原因:

docker logs cloudsql-proxy

不管是凭证无效、实例不存在还是网络不通,日志里都会有明确提示。

给你一个完整的参考配置

你可以对比着调整自己的docker-compose:

version: "3"
volumes:
  sqlproxy:
services:
  cloudsql-proxy:
    container_name: cloudsql-proxy
    image: gcr.io/cloudsql-docker/gce-proxy:1.11
    volumes:
      # 替换成你本地的服务账号密钥路径
      - ./service-account-key.json:/config/service-account-key.json
      - sqlproxy:/cloudsql
    command: /cloud_sql_proxy --dir=/cloudsql -instances=你的完整实例ID=tcp:0.0.0.0:3306 -credential_file=/config/service-account-key.json
    # 本地调试时可以暴露端口,容器内部访问不需要这行
    ports:
      - "3306:3306"
  # 你的应用容器示例
  my-app:
    build: .
    depends_on:
      - cloudsql-proxy
    environment:
      # 应用的数据库地址要指向proxy服务名
      DB_HOST: cloudsql-proxy
      DB_PORT: 3306

内容的提问来源于stack exchange,提问作者pbeck

火山引擎 最新活动