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
。
但我还是很困惑。我的问题是:
轨道环境是否需要手动设置以及如何设置?我知道我们可以通过SSH运行类似
sudo apt install xxx
的东西,但我认为在生产中这有点奇怪。我们能不能像cf push
或其他cf任务那样,用一种更优雅的方式来做呢?所以我需要使用Flyway数据库迁移,但是我们如何才能上传脚本(作为文件)或将.sql文件保存到CF空间呢?SSH?
我在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任务运行。
那不太对。任务是附加到应用程序的资源。它会根据应用程序使用的快捷方式触发创建一个单独的容器,您设置的命令将在其中执行。任务应该有有限的生存期(即,它将运行,然后退出),而不是预期将永远运行并继续运行的应用。
任务将在配置为与应用完全相同的容器中运行,这还包括设置环境变量和绑定服务,就像您的应用一样。
第一步是您需要
- 是否需要手动设置轨道环境?如何设置?我知道我们可以通过SSH运行类似sudo apt install xxx的东西,但我认为在生产中这有点奇怪。我们能不能用一种更优雅的方式,比如cf推送或者其他cf任务?
cf push
您的Rails应用程序。当您cf push
应用程序时,Ruby构建包将运行并安装运行您的应用程序所需的一切。然后,生成的快捷批处理程序将可用于运行您的应用程序或其他任务。
如果要确保任务在应用程序启动之前运行(这通常是您在数据库迁移中需要的),则会稍显棘手。
您可以这样做:
- 运行
cf push --no-start
。这一论点确保了你的应用程序不会启动。遗憾的是,这也意味着应用程序不能暂存,因此我们还无法运行任务。 - 运行
cf v3-packages my-cool-app
(V6 Cf Cli)或cf packages my-cool-app
(V7 Cf Cli)。复制最新的包GUID,如果这是您的第一次推送,将只有一个推送。 - 运行
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。
然后运行 - 您现在可以
cf run-task
。
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)。这会将创建的液滴设置为当前活动的液滴。
- 所以我需要使用Flyway数据库迁移,但是我们如何才能上传脚本(作为文件)或将.sql文件保存到CF空间呢?SSH?
如前所述,您可以从推送您的应用程序开始。在应用程序试运行之后,您可以运行任务,该任务可以是任何命令。在您的情况下,您需要指定运行迁移的命令。
将从中运行命令的当前工作目录将是您的应用程序的根目录(即您cf push
d或cf push
的-p
参数)。
您只能运行base image中存在的内容或已由构建包安装的内容。如果您运行的是Java构建包,您将拥有可用的Java(特别是JRE)。默认情况下不在$路径上,但您可以运行
- 我在cf空间上测试了一下。我只能运行java,因为它附带一个java构建包。因此问题变成了:如何运行Java脚本(与问题2问题相同)或
.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/.
,基本相同。
相关文章