cf run-task 运行前需要上传 env/script 吗?一种优雅的方式?

2024-02-03

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

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

但我还是很困惑。我的问题是:

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

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

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

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


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

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

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

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

第一步是您需要cf push你的 Rails 应用程序。当你cf push对于应用程序,Ruby 构建包将运行并安装运行应用程序所需的所有内容。然后生成的 Droplet 将可用于运行您的应用程序或其他任务。

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

您可以这样做:

  1. Run cf push --no-start。该参数确保您的应用程序不会启动。不幸的是,这也意味着应用程序不会暂存,因此我们还无法运行任务。
  2. Run cf v3-packages my-cool-app(v6 cf cli) 或cf packages my-cool-app(v7 参见 cli)。复制最新的软件包 guid,如果这是您第一次推送,则只有一个。
  3. 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>清单。复制该指南。
  4. 然后运行cf v3-set-droplet my-cool-app -d <droplet-guid>(v6 cf cli) 或cf set-droplet my-cool-app -d <droplet-guid>(v7 参见 cli)。这会将创建的液滴设置为当前活动的液滴。
  5. 你现在可以cf run-task.
  1. 所以我需要使用flyway db迁移,但是我们如何上传脚本(作为文件)或将.sql文件保存到CF空间? SSH?

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

运行命令的当前工作目录将是应用程序的根目录(即您的应用程序的根目录)cf push-p论证cf push).

  1. 我在我的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/.,这基本上是一样的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cf run-task 运行前需要上传 env/script 吗?一种优雅的方式? 的相关文章

  • 上传进度条 Java Servlet?

    我想使用 servlet 显示上传进度条 我尝试过Ajax iFrame 技术 页面没有重新加载 文件也被上传 但是 进度条没有出现 有没有可用于 javaservlts 的 jQuery 进度插件 Thanks 我强烈推荐jQuery 上
  • Jackson JSON + Java 泛型

    我正在尝试将以下 JSON 反序列化 映射到List
  • Java将字符串解析为double

    如何解析字符串中的这个 Double 00034800 变成 Double 值 最后两位数字实际上是小数点 所以我正在寻找的结果是348 00 是否有这样的格式可以与十进制格式一起使用 Well String s 00034800 doub
  • 在不支持 CAS 操作的处理器上进行 CompareAndSet

    今天 我在一次采访中被问到下一个问题 如果您在具有不支持 CAS 操作的处理器的机器上调用 AtomicLong 的compareAndSet 方法 会发生什么情况 您能否帮我解决这个问题 并在可能的情况下提供一些全面描述的链接 From
  • Java 中的 <-- 是什么? [复制]

    这个问题在这里已经有答案了 我遇到了下面的片段 它输出到4 3 2 1 我从来没有遇到过 lt 在爪哇 Is lt 使 var1 的值变为 var2 的运算符 public class Test public static void mai
  • 使用 Exec Maven 插件分叉 Java,而不使用“exec”目标

    来自文档 https www mojohaus org exec maven plugin exec exec在单独的进程中执行程序和Java程序 exec java在同一虚拟机中执行 Java 程序 我想 fork 一个 java 程序
  • 查看Java Agent修改的Java类的源代码

    我需要了解 Java 代理如何修改我的初始类 以便我能够理解代码的作用 build gradle configurations jar archiveName agent2 jar jar manifest attributes Prema
  • 自定义列表字段点击事件

    我正在编写一个应用程序 其中我创建了用于显示列表视图的自定义列表字段 我的 CustomListField 包含连续的一个图像和文本 我正在通过单击列表字段行获取字段更改侦听器 但我也想将字段更改侦听器放在图像上 谁能告诉我我该怎么做 这是
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • 如何使用双重调度来分析图形基元的交集?

    我正在分析图形基元 矩形 直线 圆形等 的交互并计算重叠 相对方向 合并等 这被引用为双重调度的一个主要示例 例如维基百科 http en wikipedia org wiki Double dispatch 自适应碰撞算法通常要求 不同的
  • 如何在 IntelliJ IDEA 中运行 akka actor

    来自 Akka 网站文档 然后 这个主要方法将创建所需的基础设施 运行演员 启动给定的主要演员并安排 一旦主要参与者终止 整个应用程序就会关闭 因此 您将能够使用类似于以下的命令运行上面的代码 下列的 java classpath akka
  • IntelliJ Idea:将简单的 Java servlet(无 JSP)部署到 Tomcat 7

    我尝试按照教程进行操作here http wiki jetbrains net intellij Creating a simple Web application and deploying it to Tomcat部署 servlet
  • 类更改(例如字段添加或删除)是否保持 Serialized 的向后兼容性?

    我有一个关于 Java 序列化的问题 在这种情况下 您可能需要修改可序列化类并保持向后兼容性 我有丰富的 C 经验 所以请允许我将 Java 与 NET 进行比较 在我的Java场景中 我需要使用Java的运行时序列化机制序列化一个对象 并
  • Azure Java SDK:ServiceException:ForbiddenError:

    尝试了基本位置检索器代码 如下所示 String uri https management core windows net String subscriptionId XXXXXXXX 5fad XXXXXX 9dfa XXXXXX St
  • 我所有的 java 应用程序现在都会抛出 java.awt.headlessException

    所以几天前我有几个工作Java应用程序使用Swing图书馆 JFrame尤其 他们都工作得很好 现在他们都抛出了这个异常 java awt headlessexception 我不知道是什么改变了也许我的Java版本不小心更新了 谢谢你尽你
  • 在 Java 中通过 D-Bus MPRIS 访问 Clementine 实例

    我使用 Clementine 作为音乐播放器 它可以通过 D Bus 命令进行控制 在命令行上 使用 qdbus 我可以 Start Stop 暂停播放器 强制它跳过播放列表中的歌曲 检查播放列表的长度 检查播放列表中当前播放的曲目及其元数
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上
  • GAE 无法部署到 App Engine

    我正在尝试从 Eclipse 发布 Web 应用程序 我在 GAE 上创建了四个项目 可以通过登录我的帐户并查看控制台来查看它们 我已经改变了appengine web xml到项目的应用程序 ID 如果我将其更改为 GAE 上第一个创建的

随机推荐

  • 与使用“普通”PHP 相比,使用 CodeIgniter 或 CakePHP 等框架有什么优势? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是 PHP 新手 在明天某个时候开始学习代码之前 我将尝试进行更多概述 与使用 普通 PHP 相比 使用 CodeIgniter C
  • 在javascript中从java servlet读取数组

    你好 就像标题所说的 我正在尝试从我的 java Servlet 中读取一个数组 我正在尝试读取 java 脚本文件中的数组 Java servlet 代码 String graphData dbHandler select attribu
  • 错误膨胀类片段类未找到 android.view.fragment 但我包括兼容性库?

    尽管我使用的是兼容性库 但我看到 android view fragment 未找到类异常 编译正常但崩溃 3 0 之前的版本中我应该使用另一个软件包吗 我已经将所有片段类更改为 android support v4 app Frament
  • 使用 Lodash 按值对对象数组进行排序

    我正在尝试按 名称 值对数组进行排序 使用 Lodash 我使用 Lodash 文档创建了下面的解决方案 但是 orderBy 似乎根本没有任何影响 任何人都可以阐明对数组进行排序的正确方法吗 字符数组 id 25 name Anakin
  • 如何合并 2 个 javascript 对象,如果另一个对象中不存在属性,则填充一个对象中的属性?

    如果我有一个 javascript 对象 assoc 数组定义如下 function somefunction options var defaults prop1 foo prop2 bar Do stuff here 我想使用它作为该函
  • 如何使用pickle保存sklearn模型

    我想使用 Pickle 转储并加载我的 Sklearn 训练模型 怎么做 Save import pickle with open model pkl wb as f pickle dump model f Load with open m
  • NSTableView 左上角的奇怪矩形(NSBannerView)

    我正在开发 macOS 应用程序 但遇到了一个奇怪的问题 在我的 NSTableView 的左上角 标题上方 显示一个灰色矩形 我在 NSTableView 后面添加了一个 NSBox 以便在屏幕截图中更清晰 通过调试视图层次结构 我看到它
  • 页面重新加载后显示附加图像

    我正在将图像附加到页面中 还有一个复选框可以查看附加项目和隐藏附加项目 我将数据保存在 JSON 数组中 即使在重新加载选项卡后 我也想显示这些附加图像 当您通过 JavaScript 对 DOM 进行动态更改时 它们不是持久的 如果你想做
  • 使 Azure DocumentDB 不返回服务字段

    我在节点应用程序中为 Azure DocumentDB 使用类似 SQL 的语法 这是方法代码 client queryDocuments collection self SELECT FROM root toArray function
  • 在数据库中存储不同图像的最佳方式是什么?

    为不同目的存储图像的最佳方法 关于数据库设计 是什么 我有一堆用户照片 还有另外 5 组不同的照片 类似于用户照片 但与用户照片没有联系 最好是将所有照片存储在一个数据库表中并尝试从该表中引用它们 还是最好为每组照片创建不同的表 我可以看到
  • masm 错误 A2075:跳转目的地太远:30 个字节

    我的女士给我布置了一个作业 其中我必须编写一个程序 该程序将通过键盘获取输入并检查嵌套括号的常规顺序 例如 input output 正确的格式 input output 不正确 我的程序 model small stack 100h 38
  • Spring AutoPopulateList 最大大小?

    我对 Spring 自动填充列表有疑问 我的用例如下 管理可以访问应用程序的用户列表 在 GUI 方面 我使用自动完成字段来搜索用户并将用户添加到右侧的表中 用户也可以从表中删除 当 GUI 用户提交时 GUI 会动态构建一个包含用户字段的
  • 读取文本文件的行并收到 Charmap 解码错误

    我使用 python3 3 和 sqlite3 数据库 我有一个大约 270mb 的大文本文件 我可以在 Windows7 中使用写字板打开它 该文件中的每一行如下所示 术语 t编号 n 我想读取每一行并将值保存在数据库中 我的代码如下所示
  • java.lang.ClassNotFoundException: org.apache.jsp.index_jsp

    我有一个旧的 struts 1 应用程序 一直使用 Ant 构建 我正在将其转换为使用 Maven 我的应用程序的结构是模块化的 在包含模块中进行依赖管理 包含模块的 dep mgmt 部分包含
  • 在 switch-case 中创建一个对象

    我使用 Visual Studio 2008 C 在我的开关案例中 a 想要创建一个对象 但我不工作 我无法在开关盒中创建对象 对吗 如果这是正确的 解决这个问题的最佳方法是什么 创建该对象的新方法 编辑代码 switch causwahl
  • Laravel 在身份验证后重定向到登录

    PROBLEM 我正忙于我的第一个 Laravel 应用程序 尽管我看到了这种编写方式的好处 但我很难理解其中的一些行为 当我尝试登录时 我被重定向到登录页面 看起来用户身份验证正确 但无论如何它都会重定向到登录页面 我拥有的 我的用户表如
  • 在 python 中迭代和更新列表[重复]

    这个问题在这里已经有答案了 我无法理解为什么下面的代码会无限期地出现 循环 当我不使用复制列表时 list Mohit kumar sffsfshfsd for w in list if len w gt 5 list insert 0 w
  • 在 JPA 上选择 DISTINCT

    我有一张桌子ISO 4217 值 https en wikipedia org wiki ISO 4217货币 有 6 行 ID 国家 地区 货币名称 字母代码 数字代码 次要单位 我需要获取一些数据4种最常用的货币 https en wi
  • 错误 C2143:语法错误:缺少 ';'在“输入”之前

    我是 C 编程新手 请告诉我这个程序有什么问题 以及为什么我收到此错误 错误 C2143 语法错误 缺少 在 输入 之前 extern void func int main int argc char argv func int i 1 f
  • cf run-task 运行前需要上传 env/script 吗?一种优雅的方式?

    我正在与 Cloud Foundry 合作 My need是在我的应用程序之外运行数据库迁移 以便我可以在需要时以某种方式 cf 命令 api 调用等 触发迁移 我被推荐使用cf run task 经过检查 我的理解是 cf run tas