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

我在云铸造厂工作。我的需要是在我的应用程序之外运行数据库迁移,以便我可以在需要时以某种方式(cf命令、API调用等)触发迁移。

建议我使用cf run-task。经过检查,我的理解是cf run-task是cf空间的&q;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数据库迁移,但是我们如何才能上传脚本(作为文件)或将.sql文件保存到CF空间呢?SSH?

  3. 我在cf空间上测试过。我只能运行java,因为它附带一个java构建包。因此问题变成了:如何在推送的JAR中运行Java脚本(与问题2问题相同)或Java类来运行数据库迁移?

我是CF的新手,这可能是一个非常愚蠢的问题,但我已经花了几天的时间来研究它,还没有得到正确的答案。我的临时解决方案是在控制器中公开一个";/dbMigration&qot;API。然后在服务中实现数据库迁移。然后,我可以在需要时运行cf run-task APP_NAME -c "curl https://xxxxx.xxx.xxx/dbmigration" 来触发数据库迁移。但是我仍然需要在应用程序服务中处理dbname、user、password等,这不是我喜欢的。 提前谢谢。


解决方案

我被推荐使用cf run-task。经过检查,我的理解是cf run-task是cf空间的SSH客户端&接口,因为我们甚至可以将";echo 1";作为cf任务运行。

那不太对。任务是附加到应用程序的资源。它会根据应用程序使用的快捷方式触发创建一个单独的容器,您设置的命令将在其中执行。任务应该有有限的生存期(即,它将运行,然后退出),而不是预期将永远运行并继续运行的应用。

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

  1. 是否需要手动设置轨道环境?如何设置?我知道我们可以通过SSH运行类似sudo apt install xxx的东西,但我认为在生产中这有点奇怪。我们能不能用一种更优雅的方式,比如cf推送或者其他cf任务?
第一步是您需要cf push您的Rails应用程序。当您cf push应用程序时,Ruby构建包将运行并安装运行您的应用程序所需的一切。然后,生成的快捷批处理程序将可用于运行您的应用程序或其他任务。

如果要确保任务在应用程序启动之前运行(这通常是您在数据库迁移中需要的),则会稍显棘手。

您可以这样做:

  1. 运行cf push --no-start。这一论点确保了你的应用程序不会启动。遗憾的是,这也意味着应用程序不能暂存,因此我们还无法运行任务。
  2. 运行cf v3-packages my-cool-app(V6 Cf Cli)或cf packages my-cool-app(V7 Cf Cli)。复制最新的包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的输出,它是正在运行的构建包和正在创建的液滴。输出将显示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. 所以我需要使用Flyway数据库迁移,但是我们如何才能上传脚本(作为文件)或将.sql文件保存到CF空间呢?SSH?

如前所述,您可以从推送您的应用程序开始。在应用程序试运行之后,您可以运行任务,该任务可以是任何命令。在您的情况下,您需要指定运行迁移的命令。

将从中运行命令的当前工作目录将是您的应用程序的根目录(即您cf pushd或cf push-p参数)。

  1. 我在cf空间上测试了一下。我只能运行java,因为它附带一个java构建包。因此问题变成了:如何运行Java脚本(与问题2问题相同)或
您只能运行base image中存在的内容或已由构建包安装的内容。如果您运行的是Java构建包,您将拥有可用的Java(特别是JRE)。默认情况下不在$路径上,但您可以运行.java-buildpack/open_jdk_jre/bin/java

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

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

请注意,Java构建包必须是列出的最后一个构建包。它只能作为最终生成包使用。

我推送的JAR中的Java类以运行数据库迁移?

如前所述,当前工作目录是您推送的根目录(对于Java,它是jar/war的根目录)。因此,您可以执行java -cp . com.example.Main,其中-cp .设置类路径以包括您的类文件所在的当前目录。如果您查看Java构建包生成的命令来运行您的应用程序,它将是类似的。有$PWD/.,基本相同。

相关文章