sandbox_wire
把宣告過的名字在箱子裡你的程序與 externalBaseUrl 之間切換、在跑著的箱子上宣告新名字,或讓名字指向別的箱子或發布好的版本。
| 輸入 | 輸出 |
|---|---|
id、service,加上 mode(box 或 external);或 port 與選填的 targetPort;或 port、fromBox 與選填的 fromPort(link);或 port、version 與選填的 containerPort、env(已發布的版本);或不給服務、改給 scenePaths |
wiring(externalBaseUrl、entry、services[{name, port, targetPort, address, mode, web}])、dns;link 時回 links[{name, port, fromBox, fromPort, fromStatus, active, opened, failed}];版本時回 service(附它的 run)與 next |
只有箱子有 externalBaseUrl(sandbox_start 給的,或從環境帶來的)時才需要,或是要在跑著的箱子上補宣告名字時用。
mode: "box":name:port連到箱子裡你自己的程式,也就是這個服務的targetPort。mode: "external":name:port重新轉到externalBaseUrl。箱子沒有externalBaseUrl時會失敗:那時每個宣告的服務本來就連到箱子裡你的程式,沒有東西要 wire;要讓名字連到你的 dev,就帶environment(會帶來它的externalBaseUrl)或externalBaseUrl開箱。- 共用同一個
targetPort的名字是同一個程式,一起切換。 - 切換只改轉送規則;boxd 不為它佔任何 port,所以你的程式可以早就在跑。已經連著的連線照舊,新的連線走新的模式。
port加上選填的targetPort:在跑著的箱子上把service宣告成一個新的主機名。它有自己的位址,之後跟開箱時給的名字一樣解析得到,name:port連到targetPort(沒給就跟port一樣;port是 80 或 9095 時必填)。此時mode不看:新名字跟著同一個targetPort上既有名字的模式;沒有的話,有externalBaseUrl的箱子上以external開始,沒有的以box開始。這個名字會記在箱子上:出現在sandbox_status.services,boxd 重啟後也還在。不帶web就沒有網址;帶web: true時,新映像箱子的每個 web 服務都有可用網址,即使不是第一個服務。舊映像箱子不能這樣新增第二個 web 服務,會回 409 並說明開新箱子的做法。位址範圍不能這樣加。現在是 link 或環境位址的名字,在有take-over功能的箱子上會就地接手(接手 link 或環境位址);比較舊的箱子上,環境位址照樣經連接器連出去,link 的名字則回 409。給既有的名字另一個port或targetPort就是把它搬過去。只給targetPort不給port回 400。- 只給
web: true、不給port:把已經宣告的服務標成web,讓webUrl與 app 的「使用」按鈕打開它。sandbox_review的卡片打開什麼不由這個標記決定,而是由那次呼叫的open(web時再加port)指定。mode可省略,省略時保留目前的接線模式;帶了則同時切換模式。新映像箱子的每個 web 服務都有可用網址:第一個使用sceneUrl,其他服務使用各自的網址。舊映像箱子把第二個服務標 web 時會回 409,並提示開新箱子。 port加上fromBox與選填的fromPort:宣告一條連到你另一個箱子的 link,或把既有的 link(同一個service與port)重新指過去。這時回的是{ "links": [...] },也就是這個箱子全部的 link。見連到別的箱子。port加上version與選填的containerPort、env:在跑著的箱子上宣告這個名字,並在它底下跑那個已發布的版本,原本跑的版本會被換掉。回的是{ "service": {...}, "next": "..." },也就是這個服務與它的run。見跑發布好的版本。scenePaths(取代service):sceneUrl上要由箱子轉到externalBaseUrl的路徑前綴,例如["/api"],路徑照原樣保留。從sceneUrl載入的頁面就能同源呼叫環境的 API,環境不用為箱子網址加 CORS(在那裡放行*.box.parallelsandbox.com等於讓每個帳號的箱子都進得去)。每次呼叫整份換掉;[]清空。路徑以/開頭,/_sbx是箱子自己的,箱子要有externalBaseUrl。回傳帶這些路徑的接線表。targetPort上線前開的箱子跑的是舊版 boxd,不支援它:在那種箱子上,跟port不同的targetPort會回 409,訊息裡會講明。開一個新箱子,或把服務宣告在你的程式聽的 port 上,不帶targetPort,也不用 80 或 9095。- 回傳值是整張接線表,
sandbox_status.wiring裡也有:externalBaseUrl、entry(第一個服務,sceneUrl打開的就是它),以及每個服務的port、targetPort、address(名字在箱子裡的位址;位址範圍沒有)、mode與web;加上dns:箱子自己回答的每個名字與它的位址(宣告的服務,以及環境的主機名)。 - 同一個
docker compose專案裡的服務也會透過 compose 網路互相找到。
所有工具與主題都列在工具參考。