无法连接Cloud SQL Proxy求助(Kubernetes+Elixir/Phoenix场景)
解决Cloud SQL Proxy + psql连接失败的问题
你的报错根源很明确:psql的-h参数传错了路径——你把Cloud SQL Proxy创建的socket文件路径传给了-h,但psql会把这个路径当成目录,试图在里面找PostgreSQL默认的socket文件(.s.PGSQL.5432),可这个路径实际上是一个socket文件而非目录,所以才会报Not a directory错误。
这里给你两种简单的解决办法,选一种适合你的就行:
方法1:改用TCP端口连接(推荐,更直观)
先停止当前运行的Cloud SQL Proxy,然后用TCP端口模式重新启动:
cloud_sql_proxy -instances=instance-id:region:instance-name=tcp:5432
接着在另一个终端执行psql命令:
psql -U postgres -h localhost
这种方式完全避开了Unix socket的路径问题,后续给Phoenix项目配置数据库连接也更简单(直接用localhost:5432即可)。
方法2:修正Unix socket的psql命令
如果你坚持要用Unix socket方式,需要让psql直接连接到Proxy创建的socket文件,而不是把它当作目录。可以用PostgreSQL的连接字符串格式执行命令:
psql "host=/tmp/cloudsql/instance-id:region:instance-name user=postgres dbname=postgres"
额外的权限检查(避免后续坑)
你之前执行的chmod +x /tmp/cloudsql其实不对——目录需要的是读写执行权限,正确的权限设置应该是:
chmod 777 /tmp/cloudsql
这不是你当前报错的直接原因,但确保权限正确可以避免后续出现连接权限不足的问题。
顺带提下Phoenix项目的配置调整
如果用TCP方式,你的数据库配置(比如config/dev.exs)应该改成这样:
config :my_app, MyApp.Repo, username: "postgres", password: "你的数据库密码", database: "my_app_dev", hostname: "localhost", port: 5432, pool_size: 10
如果用Unix socket方式,配置需要指定socket参数:
config :my_app, MyApp.Repo, username: "postgres", password: "你的数据库密码", database: "my_app_dev", socket: "/tmp/cloudsql/instance-id:region:instance-name", pool_size: 10
内容的提问来源于stack exchange,提问作者kokorokun
相关产品推荐
相关产品推荐

