分享與複製
範本有兩個識別碼,它們回答的是不同的問題。
| 識別碼 | 形式 | 何時改變 | 回答什麼 |
|---|---|---|---|
id | 一個 UUID | 永不改變 | 「這是哪一筆範本資料?」 |
hash_id | th_ 後面接一段十六進位摘要 | 啟動配方變動時 | 「這究竟是哪一份配方?」 |
id 代表那一筆資料。hash_id 是決定實際啟動內容的那些欄位的內容雜湊,所以兩個配方完全相同的範本仍會得到不同的雜湊 —— 因為資料本身的識別也被算了進去 —— 而同一筆資料在做過表面性的編輯後仍保有原本的雜湊。
雜湊涵蓋的範圍
| 在雜湊內 | 不在雜湊內 |
|---|---|
image、tag、repo | name、description |
launch_mode、args_str、onstart | readme、連結 |
env、ports、constraints | visibility、排序順序 |
jupyter_dir、use_jupyter_lab | 私有登錄庫密碼 |
registry_user | use_count、時間戳記 |
替範本改名、重寫它的 readme、把它從私有翻成公開:雜湊不動。改一個連接埠、一個環境變數項目、啟動時指令碼或映像檔:雜湊當場重新產生。
舊的雜湊不再屬於任何範本,所以用它建出來的釘選連結會回傳 TEMPLATE_NOT_FOUND。編輯配方之後,請重新複製釘選連結並再傳一次。
分享
在範本卡片或詳細資料上按 分享 會提供兩種連結。
| 連結 | 形式 | 行為 |
|---|---|---|
| 推薦 | /templates?t=<id> | 跟著範本走。收到的人永遠看到你最新的編輯內容。 |
| 釘選 | /templates?h=<hash_id> | 指名某一份確切的配方,你一改動它就會失效。 |
兩種連結都會在收件人的範本庫中開啟範本詳細資料,他們可以從那裡啟動或複製它。兩者本身都不授予存取權:收件人必須原本就看得到該範本。也就是說,它得是 system 範本、public 範本,或由他們所屬組織擁有的範本。把私有範本的連結傳給組織外的人,他們只會拿到 404。
以雜湊查詢範本
釘選連結只是包在一個端點外面的殼:
curl "$SUPERHEAT_API/v1/templates/by-hash/th_9f2c…" \
-H "Authorization: Bearer $SUPERHEAT_KEY"
它回傳的物件與 GET /v1/templates/{id} 相同,套用相同的可見性規則與相同的機密值遮蔽;當雜湊比不到任何你看得到的範本時,回傳 404 TEMPLATE_NOT_FOUND。
這是達成可重現性的工具。把 hash_id 連同訓練任務一起記下來,之後查詢時要嘛回傳你當初用的那份確切配方,要嘛告訴你它已經改過了 —— 這比無聲地交給你一個不同的環境有用得多。
複製
複製是你以無法編輯的範本為基礎繼續開發的方式:精選的 system 範本,或另一個組織的公開範本。
curl -X POST "$SUPERHEAT_API/v1/templates/$TEMPLATE_ID/duplicate" \
-H "Authorization: Bearer $SUPERHEAT_KEY"
副本會立即建立,而且:
- 屬於你目前的組織,並記錄你為建立者
- 一律是
private,不論來源是什麼 - 命名為
<source name> (copy),若該名稱已被使用則為(copy 2)、(copy 3),依此類推 - 帶有全新的
id與全新的hash_id,啟動次數從零開始 - 原封不動複製映像檔、啟動模式、引數、啟動時指令碼、連接埠與限制條件
當來源不是你的時,有兩樣東西刻意不會被複製:
| 不會複製的項目 | 原因 |
|---|---|
| 機密環境變數值 | 你從來就沒有讀取它們的權限;副本中的值會是空白的,而 secret 旗標保持不變。 |
| 私有登錄庫的使用者名稱與密碼 | 原因相同。請在副本上重新輸入你自己的憑證。 |
複製你的組織已經擁有的範本則會保留這兩者,因為並沒有揭露任何新的東西。
常見的工作流程
- 找一個接近你需求的精選範本。
- 複製它。
- 編輯副本 —— 換掉映像檔標籤、加上連接埠、寫一段啟動時指令碼。
- 啟動它,確認可以運作,然後把釘選連結分享給你的團隊。
- 當你改動配方時,重新分享一次連結。
刪除範本不會影響已經用它部署出來的執行個體,也不會使任何東西失效,除了範本庫中的項目與它的連結。