建议我使用 cf run-task。经过检查,我的理解是,cf run-task 是 cf 空间的“SSH 客户端”接口,因为我们甚至可以将“echo 1”作为 cf 任务运行。
这不太正确。任务是附加到应用程序的资源。它会根据您的应用程序使用的 Droplet 触发创建一个单独的容器,其中将执行您设置的命令。任务预计有有限的生命周期(即它将运行,然后退出),而不是预计永远运行并继续运行的应用程序。
该任务将在与应用程序完全相同配置的容器中运行,这还包括像您的应用程序一样设置环境变量和绑定服务。
- Rail 环境是否需要手动设置以及如何设置?我知道我们可以通过 SSH 运行 sudo apt install xxx 之类的东西,但我认为这在生产中有点奇怪。我们可以用更优雅的方式来做到这一点,比如 cf Push 或其他 cf 任务吗?
第一步是您需要cf push
你的 Rails 应用程序。当你cf push
对于应用程序,Ruby 构建包将运行并安装运行应用程序所需的所有内容。然后生成的 Droplet 将可用于运行您的应用程序或其他任务。
如果您想确保任务在应用程序启动之前运行(这通常是数据库迁移所需的),那就有点棘手了。
您可以这样做:
- Run
cf push --no-start
。该参数确保您的应用程序不会启动。不幸的是,这也意味着应用程序不会暂存,因此我们还无法运行任务。
- Run
cf v3-packages my-cool-app
(v6 cf cli) 或cf packages my-cool-app
(v7 参见 cli)。复制最新的软件包 guid,如果这是您第一次推送,则只有一个。
- Run
cf v3-stage my-cool-app --package-guid <package-guid>
(v6 cf cli) 或cf stage my-cool-app --package-guid <package-guid>
(v7 参见 cli)。您将看到类似于以下内容的输出cf push
,这是构建包正在运行并且正在创建一个 Droplet。输出会说Packaged staged
并有一个droplet guid: <guid>
清单。复制该指南。
- 然后运行
cf v3-set-droplet my-cool-app -d <droplet-guid>
(v6 cf cli) 或cf set-droplet my-cool-app -d <droplet-guid>
(v7 参见 cli)。这会将创建的液滴设置为当前活动的液滴。
- 你现在可以
cf run-task
.
- 所以我需要使用flyway db迁移,但是我们如何上传脚本(作为文件)或将.sql文件保存到CF空间? SSH?
如前所述,您首先要推送您的应用程序。应用程序暂存后,您可以运行任务,该任务可以是任何命令。在您的情况下,您需要指定运行迁移的命令。
运行命令的当前工作目录将是应用程序的根目录(即您的应用程序的根目录)cf push
或-p
论证cf push
).
- 我在我的cf空间上测试过。我只能运行java,因为它带有java构建包。所以问题变成:我如何运行java脚本(与问题2相同的问题)或
您只能运行存在于基础图像 https://hub.docker.com/r/cloudfoundry/cflinuxfs3或已由构建包安装。如果您正在运行 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'
如果您需要其他工具,那么您可以运行多个构建包。例如,如果您需要执行 Javascript 代码,您可以运行 Node.js buildpack。还有一个apt 构建包 https://github.com/cloudfoundry/apt-buildpack可用于安装通过 apt 或 可用的附加软件包.deb
files.
请注意,Java 构建包must是列出的最后一个构建包。它仅作为最终构建包使用。
我推送的 jar 中的 java 类来运行数据库迁移?
如前所述,当前工作目录是您推送内容的根目录(对于 Java,它是 JAR/WAR 的根目录)。所以你可以做java -cp . com.example.Main
where -cp .
将类路径设置为包含类文件所在的当前目录。如果您查看 Java 构建包生成的用于运行应用程序的命令,您会发现它是类似的。它有$PWD/.
,这基本上是一样的。