Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 在Google Cloud构建期间在Google Cloud SQL上运行node.js数据库迁移_Google Cloud Platform_Google Cloud Sql_Google Cloud Build - Fatal编程技术网

Google cloud platform 在Google Cloud构建期间在Google Cloud SQL上运行node.js数据库迁移

Google cloud platform 在Google Cloud构建期间在Google Cloud SQL上运行node.js数据库迁移,google-cloud-platform,google-cloud-sql,google-cloud-build,Google Cloud Platform,Google Cloud Sql,Google Cloud Build,我想在云构建过程中运行node.js中编写的数据库迁移 当前,正在执行数据库迁移命令,但云构建过程似乎无权通过具有用户名/密码的IP地址连接到云SQL。云构建使用服务帐户运行,您似乎需要授予此帐户对云SQL的访问权。 您可以找到有关设置服务帐户权限的其他信息。在使用和Node.js的情况下,它看起来像这样: 步骤: #安装Node.js依赖项 -id:纱线安装 名称:gcr.io/cloud-builders/thread 等待:[“-”] #安装云SQL代理 -id:代理安装 名称:gcr.i

我想在云构建过程中运行node.js中编写的数据库迁移


当前,正在执行数据库迁移命令,但云构建过程似乎无权通过具有用户名/密码的IP地址连接到云SQL。

云构建使用服务帐户运行,您似乎需要授予此帐户对云SQL的访问权。 您可以找到有关设置服务帐户权限的其他信息。

在使用和Node.js的情况下,它看起来像这样:

步骤:
#安装Node.js依赖项
-id:纱线安装
名称:gcr.io/cloud-builders/thread
等待:[“-”]
#安装云SQL代理
-id:代理安装
名称:gcr.io/cloud-builders/thread
入口点:上海
args:
-“-c”
-“工作组https://storage.googleapis.com/cloudsql-proxy/v1.20.1/cloud_sql_proxy.linux.amd64 -O cloud\u sql\u proxy&&chmod+x cloud\u sql\u proxy”
等待:[“-”]
#将数据库架构迁移到最新版本
# https://knexjs.org/#Migrations-CLI
-id:迁移
名称:gcr.io/cloud-builders/thread
入口点:上海
args:
-“-c”
-“(./cloud\u sql\u proxy-dir=/cloudsql-instances=&sleep 2)&&knex-migrate:latest”
超时:“1200秒”
waitFor:[“纱线安装”、“代理安装”]
超时:“1200秒”
您将启动
安装
并并行下载。完成这两个步骤后,运行启动代理,等待2秒钟,最后运行
运行knex migrate:latest

要使其工作,您需要在GCP项目中启用

其中
是可以找到的云SQL实例连接名称。SQL连接设置中将使用相同的名称,例如,
host=/cloudsql/example:us-central1:pg13


此外,请确保云构建服务帐户在数据库实例所在的GCP项目中具有“云SQL客户端”角色。

从gcr.io/cloudsql docker/gce proxy的tag
1.16
开始,当前接受的答案不再有效。以下是一种不同的方法,可使代理与需要代理的命令保持相同的步骤:

-id:cmd带代理
姓名:[您的-CONTAINER-HERE]
超时时间:100秒
入口点:上海
args:
--c
-“(/workspace/cloud\u sql\u proxy-dir=/workspace-instances=[INSTANCE\u CONNECTION\u NAME]&sleep 2)&&&[YOUR-COMMAND-HERE]”
一旦主进程退出,代理将自动退出。此外,如果代理或给定的命令失败,它会将该步骤标记为“错误”

这确实需要二进制文件位于
/workspace
卷中,但可以手动或通过如下预请求步骤提供:

-id:代理安装
名称:阿尔卑斯山:3.10
入口点:上海
args:
--c
-'wget-O/workspace/cloud\u sql\u proxyhttps://storage.googleapis.com/cloudsql-proxy/v1.16/cloud_sql_proxy.linux.386 &&chmod+x/workspace/cloud\u sql\u proxy'

此外,这应该适用于TCP,因为代理将与命令位于同一容器中

下面是如何结合云构建+云SQL代理+Docker

如果您在Cloud Build中的Docker容器中运行数据库迁移/操作,它将无法直接访问您的代理,因为Docker容器与主机隔离

以下是我努力做到的:

-id:build
#构建应用程序
等待:['-']
-id:安装代理
名称:gcr.io/cloud-builders/wget
入口点:bash
args:
--c
-wget-O/workspace/cloud\u sql\u代理https://storage.googleapis.com/cloudsql-proxy/v1.15/cloud_sql_proxy.linux.386 &&chmod+x/workspace/cloud\u sql\u代理
等待:['-']
-id:迁移
名称:gcr.io/cloud-builders/docker
入口点:bash
args:
--c
- |
/workspace/cloud\u sql\u proxy-dir=/workspace-instances=projectid:region:instanceid&sleep 2&&\
docker运行-v/工作区:/root\
--env DATABASE_HOST=/root/projectid:region:instanceid\
#传递其他必要的环境变量,如db用户名/密码等。
$\u图像\u URL:$COMMIT\u SHA
超时:“1200秒”
waitFor:[生成、安装代理]
因为我们的db操作是在Docker容器中进行的,所以我找到了提供云SQL访问的最佳方法,即指定Unix套接字
-dir/workspace
,而不是公开TCP端口5432

注意:对于云构建,我建议使用目录
/workspace
而不是
/cloudsql

然后,我们将
/workspace
目录装载到Docker容器的
/root
目录,这是应用程序代码所在的默认目录。当我尝试将它装载到除
/root
之外的其他位置时,似乎什么都没有发生(可能是没有错误输出的权限问题)

另外:我注意到代理版本1.15运行良好。我对新版本有问题。您的里程数可能会有所不同。

请使用。这正是一个图像。用法(请参见链接中的自述):


-s
设置代理目标。

我尝试了类似的方法,将Cloud SQL角色添加到Cloud Build IAM中。运气不太好。您是否尝试在本地运行build。它在你的帐户下运行,如果它能正常工作-权限有问题,如果没有-其他地方有问题。这不是一个坏主意。我很快就要试一试了,这确实是一种更简单的调试方法。看起来很完美,伙计,干杯。今晚我会试一试,让你知道它是怎么回事。效果很好!对于那些没有读过Konstantin总结的人来说,这个技巧在于,Google云SQL代理的安装和迁移是以异步方式进行的,因为一旦启动云SQL代理,它就会保持打开状态
steps:
- name: "gcr.io/google-appengine/exec-wrapper"
  args: ["-i", "gcr.io/my-project/appengine/some-long-name",
         "-e", "ENV_VARIABLE_1=value1", "-e", "ENV_2=value2",
         "-s", "my-project:us-central1:my_cloudsql_instance",
         "--", "bundle", "exec", "rake", "db:migrate"]