叫用主機二進位檔

在某些情況下,您的擴充功能可能需要從主機叫用某些命令。例如,您可能想要叫用雲端提供者的 CLI 來建立新的資源,或叫用擴充功能提供的工具的 CLI,甚至叫用您想要在主機上執行的殼層指令碼。

您可以使用擴充功能 SDK 從容器執行 CLI 來做到這一點。但是,此 CLI 需要存取主機的檔案系統,如果它在容器中執行,這既不容易也不快速。

但是,主機二進位檔會從擴充功能可執行檔(如二進位檔、殼層指令碼)叫用,這些可執行檔作為擴充功能的一部分提供,並部署到主機。由於擴充功能可以在多個平台上執行,這表示您需要為您想要支援的所有平台提供可執行檔。

深入瞭解擴充功能架構

**注意**

SDK 只能叫用作為擴充功能一部分提供的可執行檔。

在此範例中,CLI 是一個簡單的 `Hello world` 指令碼,必須使用參數叫用並傳回字串。

將可執行檔新增至擴充功能


在檔案 `binaries/unix/hello.sh` 中建立適用於 macOS 和 Linux 的 `bash` 指令碼,內容如下

#!/bin/sh
echo "Hello, $1!"

在另一個檔案 `binaries/windows/hello.cmd` 中建立適用於 Windows 的 `批次指令碼`,內容如下

@echo off
echo "Hello, %1!"

然後更新 `Dockerfile` 以將 `binaries` 資料夾複製到擴充功能的容器檔案系統,並讓檔案可執行。

# Copy the binaries into the right folder
COPY --chmod=0755 binaries/windows/hello.cmd /windows/hello.cmd
COPY --chmod=0755 binaries/unix/hello.sh /linux/hello.sh
COPY --chmod=0755 binaries/unix/hello.sh /darwin/hello.sh

從 UI 叫用可執行檔

在您的擴充功能中,使用 Docker Desktop 用戶端物件以叫用擴充功能提供的殼層指令碼,方法是使用 `ddClient.extension.host.cli.exec()` 函式。在此範例中,只要呈現擴充功能檢視,二進位檔就會以 `result?.stdout` 取得的字串形式傳回結果。


export function App() {
  const ddClient = createDockerDesktopClient();
  const [hello, setHello] = useState("");

  useEffect(() => {
    const run = async () => {
      let binary = "hello.sh";
      if (ddClient.host.platform === 'win32') {
        binary = "hello.cmd";
      }

      const result = await ddClient.extension.host?.cli.exec(binary, ["world"]);
      setHello(result?.stdout);

    };
    run();
  }, [ddClient]);
    
  return (
    <div>
      {hello}
    </div>
  );
}

**重要**

我們目前尚無 Vue 的範例。填寫表單讓我們知道您是否需要 Vue 的範例。

**重要**

我們目前尚無 Angular 的範例。填寫表單 並告知我們您是否需要 Angular 範例。

**重要**

我們目前尚無 Svelte 的範例。填寫表單 並告知我們您是否需要 Svelte 範例。


設定中繼資料檔案

主機二進位檔必須在 metadata.json 檔案中指定,以便 Docker Desktop 在安裝擴充功能時將它們複製到主機上。卸載擴充功能後,複製的二進位檔也會被移除。

{
  "vm": {
    ...
  },
  "ui": {
    ...
  },
  "host": {
    "binaries": [
      {
        "darwin": [
          {
            "path": "/darwin/hello.sh"
          }
        ],
        "linux": [
          {
            "path": "/linux/hello.sh"
          }
        ],
        "windows": [
          {
            "path": "/windows/hello.cmd"
          }
        ]
      }
    ]
  }
}

path 必須參考容器內二進位檔的路徑。