叫用主機二進位檔

在某些情況下,您的擴充功能可能需要從主機呼叫某些指令。例如,您可能想要呼叫雲端供應商的 CLI 來建立新資源、呼叫擴充功能所提供的工具之 CLI,或是執行您想在主機上執行的 Shell 指令碼。

您可以使用擴充功能 SDK 從容器中執行 CLI 來達成目的。但此 CLI 需要存取主機的檔案系統,若在容器中執行,過程既不輕鬆也不快速。

然而,主機二進位檔案是從擴充功能中呼叫的(作為二進位檔案、Shell 指令碼),這些檔案隨您的擴充功能一同發布並部署到主機上。由於擴充功能可以在多個平台上執行,這意味著您需要為所有想要支援的平台發布對應的可執行檔。

了解更多關於擴充功能 架構 的資訊。

注意

只有作為擴充功能一部分發布的可執行檔,才能使用 SDK 進行呼叫。

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

將可執行檔加入擴充功能 (extension)

binaries/unix/hello.sh 檔案中為 macOS 和 Linux 建立一個 bash 指令碼,內容如下:

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

在另一個檔案 binaries/windows/hello.cmd 中為 Windows 建立一個 batch script,內容如下:

@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 Client 物件,透過 ddClient.extension.host.cli.exec() 函式來 呼叫擴充功能所提供的 Shell 指令碼。在本範例中,當擴充功能檢視渲染時,該二進位檔案會透過 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 必須參照容器內二進位檔案的路徑。

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.