我正在写一个程序,用Postgres方言与Cloud Spanner对话。我的应用程序是一个Gin服务器,我使用pgadapter连接,如this doc中所述。
我的应用程序在本地运行正常,但是当我将其部署到cloud run时,我会得到以下log.
错误主要来自StartPGAdapterWithCredentials
函数。
func StartPGAdapter(ctx context.Context, project, instance string) (port int, cleanup func(), err error) {
credentials, err := google.FindDefaultCredentials(ctx)
fmt.Println("credentials " + (credentials.ProjectID) + "json " + utils.ToString(credentials.JSON) + "ts " + utils.ToString(credentials.TokenSource))
if err != nil {
return 0, func() {}, err
}
return StartPGAdapterWithCredentials(ctx, project, instance, credentials)
}
func StartPGAdapterWithCredentials(ctx context.Context, project, instance string, credentials *google.Credentials) (port int, cleanup func(), err error) {
if credentials == nil {
return 0, func() {}, fmt.Errorf("credentials cannot be nil")
}
if credentials.JSON == nil || len(credentials.JSON) == 0 {
return 0, func() {}, fmt.Errorf("only JSON based credentials are supported")
}
credentialsFile, err := os.CreateTemp(os.TempDir(), "pgadapter-credentials")
if err != nil {
return 0, func() {}, err
}
在我的本地系统上,设置了GOOGLE_APPLICATION_CREDENTIALS
,因此它能够获取凭据。然而,这在云运行中不起作用。
如何让它在Cloud Run中运行?
附加信息:按照本例here。
1条答案
按热度按时间gjmwrych1#
您似乎试图在Cloud Run上的嵌入式容器中启动PGAdapter,然后将服务帐户凭据从您的环境复制到PGAdapter嵌入式容器。问题是Cloud Run不提供对底层服务帐户文件的访问。相反,您应该让Google Cloud库获取环境的默认凭据。
示例中的难点在于您在嵌入式容器中启动PGAdapter,这意味着该环境中没有默认凭据。在Cloud Run上运行PGAdapter的推荐方法是将其包含在主容器中。这将使PGAdapter可以仅获取Cloud Run提供的默认凭据。这意味着您应该不启动PGAdapter时指定
-c /path/to/credentials.json
参数。有(至少)两种方法可以将PGAdapter包含在主容器中:
1.将Java
.jar
文件构建添加到Docker镜像中,并在容器中启动PGAdapter。有关如何直接从.jar
文件启动PGAdapter,请参阅[本示例]。这还需要您将Java JRE添加到Docker镜像中。1.让你的Docker构建扩展PGAdapter基础Docker镜像。这将自动包含PGAdapter所需的所有依赖项。你将不得不覆盖基础镜像的
ENTRYPOINT
。请参阅PGAdapter Cloud Run Sample for Go以获取后一个选项的扩展(可运行)示例。