本文介紹了cf run-task是否需要在運行前上傳env/script?優(yōu)雅的方式?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我在云鑄造廠工作。我的需要是在我的應(yīng)用程序之外運行數(shù)據(jù)庫遷移,以便我可以在需要時以某種方式(cf命令、API調(diào)用等)觸發(fā)遷移。
建議我使用cf run-task。經(jīng)過檢查,我的理解是cf run-task是cf空間的&q;SSH客戶端&接口,因為我們甚至可以將"echo 1"作為cf任務(wù)運行。我在官方cf CLI文檔或一些在線指南上看到的示例顯示cf run-task my-app "bin/rails db:migrate" --name my-task。
但我還是很困惑。我的問題是:
軌道環(huán)境是否需要手動設(shè)置以及如何設(shè)置?我知道我們可以通過SSH運行類似sudo apt install xxx的東西,但我認(rèn)為在生產(chǎn)中這有點奇怪。我們能不能像cf push或其他cf任務(wù)那樣,用一種更優(yōu)雅的方式來做呢?
所以我需要使用Flyway數(shù)據(jù)庫遷移,但是我們?nèi)绾尾拍苌蟼髂_本(作為文件)或?qū)?sql文件保存到CF空間呢?SSH?
我在cf空間上測試過。我只能運行java,因為它附帶一個java構(gòu)建包。因此問題變成了:如何在推送的JAR中運行Java腳本(與問題2問題相同)或Java類來運行數(shù)據(jù)庫遷移?
我是CF的新手,這可能是一個非常愚蠢的問題,但我已經(jīng)花了幾天的時間來研究它,還沒有得到正確的答案。我的臨時解決方案是在控制器中公開一個";/dbMigration&qot;API。然后在服務(wù)中實現(xiàn)數(shù)據(jù)庫遷移。然后,我可以在需要時運行cf run-task APP_NAME -c "curl https://xxxxx.xxx.xxx/dbmigration" 來觸發(fā)數(shù)據(jù)庫遷移。但是我仍然需要在應(yīng)用程序服務(wù)中處理dbname、user、password等,這不是我喜歡的。
提前謝謝。
推薦答案
我被推薦使用cf run-task。經(jīng)過檢查,我的理解是cf run-task是cf空間的SSH客戶端&接口,因為我們甚至可以將";echo 1";作為cf任務(wù)運行。
那不太對。任務(wù)是附加到應(yīng)用程序的資源。它會根據(jù)應(yīng)用程序使用的快捷方式觸發(fā)創(chuàng)建一個單獨的容器,您設(shè)置的命令將在其中執(zhí)行。任務(wù)應(yīng)該有有限的生存期(即,它將運行,然后退出),而不是預(yù)期將永遠運行并繼續(xù)運行的應(yīng)用。
任務(wù)將在配置為與應(yīng)用完全相同的容器中運行,這還包括設(shè)置環(huán)境變量和綁定服務(wù),就像您的應(yīng)用一樣。
是否需要手動設(shè)置軌道環(huán)境?如何設(shè)置?我知道我們可以通過SSH運行類似sudo apt install xxx的東西,但我認(rèn)為在生產(chǎn)中這有點奇怪。我們能不能用一種更優(yōu)雅的方式,比如cf推送或者其他cf任務(wù)?
第一步是您需要cf push您的Rails應(yīng)用程序。當(dāng)您cf push應(yīng)用程序時,Ruby構(gòu)建包將運行并安裝運行您的應(yīng)用程序所需的一切。然后,生成的快捷批處理程序?qū)⒖捎糜谶\行您的應(yīng)用程序或其他任務(wù)。
如果要確保任務(wù)在應(yīng)用程序啟動之前運行(這通常是您在數(shù)據(jù)庫遷移中需要的),則會稍顯棘手。
您可以這樣做:
-
運行
cf push --no-start。這一論點確保了你的應(yīng)用程序不會啟動。遺憾的是,這也意味著應(yīng)用程序不能暫存,因此我們還無法運行任務(wù)。運行
cf v3-packages my-cool-app(V6 Cf Cli)或cf packages my-cool-app(V7 Cf Cli)。復(fù)制最新的包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的輸出,它是正在運行的構(gòu)建包和正在創(chuàng)建的液滴。輸出將顯示Packaged staged,并列出droplet guid: <guid>。復(fù)制該GUID。然后運行
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)。這會將創(chuàng)建的液滴設(shè)置為當(dāng)前活動的液滴。您現(xiàn)在可以
cf run-task。
所以我需要使用Flyway數(shù)據(jù)庫遷移,但是我們?nèi)绾尾拍苌蟼髂_本(作為文件)或?qū)?sql文件保存到CF空間呢?SSH?
如前所述,您可以從推送您的應(yīng)用程序開始。在應(yīng)用程序試運行之后,您可以運行任務(wù),該任務(wù)可以是任何命令。在您的情況下,您需要指定運行遷移的命令。
將從中運行命令的當(dāng)前工作目錄將是您的應(yīng)用程序的根目錄(即您cf pushd或cf push的-p參數(shù))。
我在cf空間上測試了一下。我只能運行java,因為它附帶一個java構(gòu)建包。因此問題變成了:如何運行Java腳本(與問題2問題相同)或
您只能運行base image中存在的內(nèi)容或已由構(gòu)建包安裝的內(nèi)容。如果您運行的是Java構(gòu)建包,您將擁有可用的Java(特別是JRE)。默認(rèn)情況下不在$路徑上,但您可以運行.java-buildpack/open_jdk_jre/bin/java。
例如:cf run-task my-cool-app '.java-buildpack/open_jdk_jre/bin/java -version'
如果您需要其他工具,那么您可以運行多個構(gòu)建包。例如,如果需要執(zhí)行Javascript代碼,可以運行Node.js構(gòu)建包。還有一個apt-buildpack可用于安裝通過APT或.deb文件提供的其他軟件包。
請注意,Java構(gòu)建包必須是列出的最后一個構(gòu)建包。它只能作為最終生成包使用。
我推送的JAR中的Java類以運行數(shù)據(jù)庫遷移?
如前所述,當(dāng)前工作目錄是您推送的根目錄(對于Java,它是jar/war的根目錄)。因此,您可以執(zhí)行java -cp . com.example.Main,其中-cp .設(shè)置類路徑以包括您的類文件所在的當(dāng)前目錄。如果您查看Java構(gòu)建包生成的命令來運行您的應(yīng)用程序,它將是類似的。有$PWD/.,基本相同。
這篇關(guān)于cf run-task是否需要在運行前上傳env/script?優(yōu)雅的方式?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,






