我浏览了所有 Google 关键字变体,并阅读了每个教程和指南两次。无法解决我的问题。
我有以下设置:
- Google App Engine(灵活)
- 谷歌云 SQL(使用 PostgreSQL)
- 与 psql 连接时已安装云代理并在本地工作
问题
一旦我将 Hydro 部署到我的应用程序引擎实例,我将收到错误消息日志和错误:
level=info msg="Connecting with postgres://*:*@/cloudsql/myProjectID:us-central1:myCloudSQLInstance/.s.PGSQL.5432/postgres?sslmode=disable"
level=error msg="An error occurred" error="Could not Connect to SQL: dial tcp [::1]:5432: getsockopt: connection refused"
当我部署 Hydra 时,套接字在/cloudsql/myProjectID:us-central1:myCloudSQLInstance
名为 的文件夹中可用.s.PGSQL.5432
。我还收到消息,/cloudsql/myProjectID:us-central1:myCloudSQLInstance/.s.PGSQL.5432
当我使用docker logs myDockerImage
. 在另一个线程中,我读到此配置可以工作。我也尝试过/cloudsql/myProjectID:us-central1:myCloudSQLInstance:5432
,即使没有端口。
似乎 Hydra 容器无法通过另一个容器(通过应用引擎自动发布)中的 Cloud SQL 套接字。我也可以说,插座需要时间预热不是问题。即使几分钟后,我也会收到相同的错误日志。最后,整个实例由于致命错误而崩溃(具有相同的错误消息)
在本地测试它我像这样启动代理:(案例1)
cloud_sql_proxy.exe -instances=myProjectID:us-central1:myCloudSQLInstance=tcp:5433
我也试过:(案例2)
cloud_sql_proxy.exe -instances=myProjectID:us-central1:myCloudSQLInstance=tcp:0.0.0.0:5433
在这两种情况下,我都更改了数据库 url,例如:
docker run -d --name hydra --network host -p 9000:4444
-e SYSTEM_SECRET=my_long_secret
-e DATABASE_URL=postgres://myUser:myPassword@127.0.0.1:5433/postgres?sslmode=disable
-e OAUTH2_ISSUER_URL=https://localhost:9000/
-e OAUTH2_CONSENT_URL=http://localhost:9020/consent
-e OAUTH2_LOGIN_URL=http://localhost:9020/login oryd/hydra:latest serve
这将适用于案例 1。但是对于这两种配置,它都会失败,并且容器会在几分钟后崩溃,就像在应用引擎上一样。我也尝试使用ipconfig
并获得了10.0.75.1
. 可以从 Hydra 容器内部 Ping 到该 IP。
但是当我psql
像这样在本地使用时:
psql "host=127.0.0.1 port=5433 sslmode=disable dbname=myDatabase user=myDBUser"
使用该命令,我可以连接到代理和 Cloud SQL 数据库。
哦,Google SQL Admin API 已激活并正常工作。
这是我用于 Google App Engine的app.yaml :
runtime: custom
env: flex
automatic_scaling:
min_num_instances: 1
resources:
cpu: 1
memory_gb: 2
disk_size_gb: 10
env_variables:
DATABASE_URL: "postgres://myuser:mypass@/cloudsql/myProjectID:us-central1:myCloudSQLInstance/.s.PGSQL.5432?sslmode=disable"
SYSTEM_SECRET: "my_long_secret"
OAUTH2_ISSUER_URL: "https://myAuth.appspot.com/"
OAUTH2_CONSENT_URL: "http://example.com/consent"
OAUTH2_LOGIN_URL: "http://example.com/login"
beta_settings:
cloud_sql_instances: "myProjectID:us-central1:myCloudSQLInstance"
所以我的问题是,是否需要一些配置才能使用 docker 连接到 Google Cloud SQL 代理?也许我缺少数据库字符串中的某些内容。这真的很难调试,因为只有connection refused
.
2018 年 6 月 29 日更新
它现在可以在我的本地机器上运行。
我使用以下命令启动 Cloud SQL 代理的 docker 映像:
docker run -d --name cloudsql -v c:\Users\myWindowsUser\Desktop\auth\cloudproxy:/cloudsql
-v c:\Users\myWindowsUser\auth\cloudproxy\config:/config
-p 127.0.0.1:3307:3307 gcr.io/cloudsql-docker/gce-proxy:1.11
/cloud_sql_proxy
-instances=myProjectID:us-central1:myCloudSQLInstance=tcp:0.0.0.0:3307
-credential_file=/config/my-auth.json
在 Windows 上,您需要在设置/共享驱动器中检查 C:(在我的情况下)。
然后postgres://myUser:myPassword@0.0.0.0:3307/postgres?sslmode=disable
作为DATABASE_URL
.
现在我只需要知道如何让它在 Google App Engine 上运行。我会及时通知你的!
更新 2:
得到它的工作。
我有两个问题:
- UNIX 套接字无法访问
- 数据库 sting 是基于 TCP 的
解决方案
docker run -d --name hydra --network host --volume=/cloudsql:/cloudsql
-p 9000:4444 -e SYSTEM_SECRET=my_long_secret
-e DATABASE_URL=postgres:///myDatabase?host\=/cloudsql/myProjectID:us-central1:myCloudSQLInstance/\&sslmode=disable\&user=myDBUser\&password=myPassword
-e OAUTH2_ISSUER_URL=https://localhost:9000/
-e OAUTH2_CONSENT_URL=http://localhost:9020/consent
-e OAUTH2_LOGIN_URL=http://localhost:9020/login oryd/hydra:latest serve
通过 hydra 的配置,我能够连接到 Cloud SQL 数据库。也许这对某人有帮助。所以问题解决了:)!