cf 运行-task 是否需要 env/script 在 运行ning 之前上传?一种优雅的方式?

Does cf run-task need env/script uploaded befrore running? An elegant way?

我正在与 Cloud Foundry 合作。 我需要 运行 除了我的应用程序之外的数据库迁移,以便我可以以某种方式触发迁移(cf 命令,api 调用等)我需要

我被推荐使用cf run-task。检查后,我的理解是,cf 运行-task 是 cf space 的“SSH 客户端”接口,因为我们甚至可以将 运行 "echo 1" 作为 cf 任务。我在官方 cf CLI 文档或一些在线指南上看到示例说 cf run-task my-app "bin/rails db:migrate" --name my-task.

但我还是一头雾水。我的问题是:

  1. 轨道环境是否需要手动设置,如何设置?我知道我们可以通过 SSH 运行 类似 sudo apt install xxx 的东西,但我认为这在生产中有点奇怪。我们可以用更优雅的方式来做,比如 cf push 或其他 cf 任务吗?

  2. 所以我需要使用 flyway db 迁移,但我们如何上传脚本(作为文件)或将 .sql 文件保存到 CF space? SSH?

  3. 我在我的 cf space 上测试过。我只能 运行 java 因为它带有 java 构建包。所以问题就变成了:我如何 运行 一个 java 脚本(与问题 2 相同的问题)或一个 java class 在我推送的罐子里到 运行数据库迁移?

我是 CF 的新手,这可能真的很愚蠢,但我已经花了好几天时间,还没有得到正确的答案。我的临时解决方案是在控制器中公开一个“/dbmigration”api。然后在服务中实现数据库迁移。然后我可以 运行 cf run-task APP_NAME -c "curl https://xxxxx.xxx.xxx/dbmigration" 在需要时触发数据库迁移。但我仍然需要在应用程序服务中处理数据库名称、用户、密码等,这不是首选。 先谢谢了。

I was recommended to use cf run-task. After checking, my understanding is that, cf run-task is a "SSH client" interface to the cf space since we can even run "echo 1" as a cf task.

不太正确。任务是附加到应用程序的资源。它会触发基于用于您的应用程序的液滴创建一个单独的容器,其中将执行您设置的命令。一个任务应该有一个有限的生命周期(即它会 运行,然后退出),而不是一个应用程序,它应该 运行 并永远继续 运行ning。

该任务将 运行 在一个与应用程序完全一样配置的容器中,这还包括像您的应用程序一样设置环境变量和绑定服务。

  1. Does the rail environment need to be setup manually and how? I know we can run something like sudo apt install xxx via SSH, but I think it's kinda weird in production. Can we do it in a more elegant way like with cf push or another cf task maybe?

第一步是您需要 cf push 您的 Rails 应用。当您 cf push 应用程序时,Ruby buildpack 将 运行 并安装 运行 您的应用程序所需的一切。然后,生成的 Droplet 将可用于 运行 您的应用或其他任务。

如果您想确保您的任务 运行s 在您的应用程序启动之前就有点棘手了,这通常是您希望进行数据库迁移的。

您可以这样做:

  1. 运行cf push --no-start。该参数确保您的应用程序不会启动。不幸的是,这也意味着该应用程序尚未暂存,因此我们还无法 运行 任务。
  2. 运行 cf v3-packages my-cool-app (v6 cf cli) 或 cf packages my-cool-app (v7 cf cli)。复制最新的package guid,如果是第一次推送就只有一个。
  3. 运行 cf v3-stage my-cool-app --package-guid <package-guid> (v6 cf cli) 或 cf stage my-cool-app --package-guid <package-guid> (v7 cf cli)。您会看到类似于 cf push 的输出,它是构建包 运行ning 和一个正在创建的 Droplet。输出将显示 Packaged staged 并有一个 droplet guid: <guid> 列表。复制该 guid。
  4. 然后 运行 cf v3-set-droplet my-cool-app -d <droplet-guid> (v6 cf cli) 或 cf set-droplet my-cool-app -d <droplet-guid> (v7 cf cli)。这会将创建的液滴设置为当前活动的液滴。
  5. 您现在可以cf run-task
  1. So I need to use flyway db migration but how we can upload a script (as a file) or save .sql files to CF space? SSH?

如前所述,您首先要推送您的应用。应用程序暂存后,您可以 运行 一个可以是任何命令的任务。在您的情况下,您将指定 运行 您的迁移的命令。

命令 运行 所在的当前工作目录将是您的应用程序的根目录(即您 cf push 或 [=10= 的 -p 参数]).

  1. I tested on my cf space. I can only run java because it comes with a java build pack. so the problem becomes: how I can run a java script (same problem as Problem 2) or

您只能 运行 base image 中存在的或已由 buildpack 安装的内容。如果您 运行 使用 Java buildpack,您将有 java(特别是 JRE)可用。默认情况下它不在 $PATH 中,但您可以 运行 .java-buildpack/open_jdk_jre/bin/java.

例如:cf run-task my-cool-app '.java-buildpack/open_jdk_jre/bin/java -version'

如果您需要其他工具,那么您可以拥有多个构建包 运行。例如,如果您需要执行 Java 脚本代码,您可以使用 Node.js buildpack 运行。还有一个 apt-buildpack 可用于安装可通过 apt 或 .deb 文件获得的其他软件包。

请注意 Java buildpack 必须 是最后列出的 buildpack。它仅作为最终构建包使用。

a java class inside my pushed jar to run the db migration?

如前所述,当前工作目录是您推送内容的根目录(对于 Java,它是您的 JAR/WAR 的根目录)。因此,您可以执行 java -cp . com.example.Main,其中 -cp . 设置 class 路径以包含当前目录,其中存在您的 class 文件。如果您查看 Java buildpack 为您的应用程序 运行 生成的命令,它会很相似。有$PWD/.,基本一样