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 網路互相找到。

所有工具與主題都列在工具參考。