我希望在Cloud Build过程中运行用Node.js编写的数据库迁移。
目前,虽然正在执行数据库迁移命令,但似乎Cloud Build过程无法通过用户名/密码连接到Cloud SQL的IP地址。
我希望在Cloud Build过程中运行用Node.js编写的数据库迁移。
目前,虽然正在执行数据库迁移命令,但似乎Cloud Build过程无法通过用户名/密码连接到Cloud SQL的IP地址。
steps:
# Install Node.js dependencies
- id: yarn-install
name: node:18
entrypoint: yarn
args: ["install", "--frozen-lockfile"]
waitFor: ["-"]
# Install Cloud SQL proxy
- id: proxy-install
name: node:18
entrypoint: sh
args:
- "-c"
- "wget https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.4.0/cloud-sql-proxy.linux.amd64 -O cloud_sql_proxy && chmod +x cloud_sql_proxy"
waitFor: ["-"]
# Migrate database schema to the latest version
- id: migrate
name: node:18
entrypoint: sh
args:
- "-c"
- "mkdir /cloudsql; chmod 777 /cloudsql; (./cloud_sql_proxy --unix-socket /cloudsql <CLOUD_SQL_CONNECTION> & sleep 2) && yarn knex migrate:latest"
timeout: "1200s"
waitFor: ["yarn-install", "proxy-install"]
timeout: "1200s"
yarn install
和下载Cloud SQL Proxy。完成这两个步骤后,你可以启动代理,等待2秒钟,最后运行yarn knex migrate:latest
。<CLOUD_SQL_INSTANCE>
是你的Cloud SQL实例连接名称,可以在此处找到here。相同的名称将用于你的SQL连接设置,例如host=/cloudsql/example:us-central1:pg13
。截至gcr.io/cloudsql-docker/gce-proxy
的标签1.16
,目前接受的答案不再适用。这里有一种不同的方法,可以使代理与需要它的命令保持在同一步骤中:
- id: cmd-with-proxy
name: [YOUR-CONTAINER-HERE]
timeout: 100s
entrypoint: sh
args:
- -c
- '(/workspace/cloud_sql_proxy -dir=/workspace -instances=[INSTANCE_CONNECTION_NAME] & sleep 2) && [YOUR-COMMAND-HERE]'
主进程退出后,代理将自动退出。另外,如果代理或给定的命令失败,它将将步骤标记为“ERROR”。
这要求二进制文件在 /workspace
卷中,但可以通过手动提供或通过类似以下的先决步骤来提供:
- id: proxy-install
name: alpine:3.10
entrypoint: sh
args:
- -c
- 'wget -O /workspace/cloud_sql_proxy https://storage.googleapis.com/cloudsql-proxy/v1.16/cloud_sql_proxy.linux.386 && chmod +x /workspace/cloud_sql_proxy'
此外,由于代理与命令在同一个容器中,因此应该可以使用TCP。
'(/workspace/cloud_sql_proxy INSTANCE_CONNECTION_NAME & sleep 2) && [YOUR-COMMAND-HERE]'
,否则步骤保持不变,并按照描述的方式工作。 - anothermh使用google-appengine/exec-wrapper。它是一个专门用于此目的的镜像。使用方法(请参见链接中的README):
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"]
-s
参数设置代理目标。Cloud Build使用服务帐户运行,看起来您需要为此帐户授予访问Cloud SQL的权限。您可以在此处找到有关设置服务帐户权限的其他信息。
- id: build
# Build your application
waitFor: ['-']
- id: install-proxy
name: gcr.io/cloud-builders/wget
entrypoint: bash
args:
- -c
- wget -O /workspace/cloud_sql_proxy https://storage.googleapis.com/cloudsql-proxy/v1.15/cloud_sql_proxy.linux.386 && chmod +x /workspace/cloud_sql_proxy
waitFor: ['-']
- id: migrate
name: gcr.io/cloud-builders/docker
entrypoint: bash
args:
- -c
- |
/workspace/cloud_sql_proxy -dir=/workspace -instances=projectid:region:instanceid & sleep 2 && \
docker run -v /workspace:/root \
--env DATABASE_HOST=/root/projectid:region:instanceid \
# Pass other necessary env variables like db username/password, etc.
$_IMAGE_URL:$COMMIT_SHA
timeout: '1200s'
waitFor: [build, install-proxy]
-dir/workspace
而不是暴露TCP端口5432。/workspace
而不是/cloudsql
。/workspace
目录挂载到Docker容器的/root
目录,这是您的应用程序代码所在的默认目录。当我尝试将其挂载到除/root
以外的其他目录时,似乎什么也没有发生(可能是权限问题,没有错误输出)。