呼叫主機二進位制檔案

在某些情況下,您的擴充套件可能需要呼叫主機的某些命令。例如,您可能希望呼叫雲提供商的 CLI 以建立新資源,或者您的擴充套件提供的工具的 CLI,甚至是在主機上執行的 shell 指令碼。

您可以透過使用擴充套件 SDK 從容器執行 CLI 來實現。但是這個 CLI 需要訪問主機的 filesystem,如果在容器中執行,這既不容易也不快。

然而,主機二進位制檔案透過作為擴充套件的一部分提供並部署到主機的擴充套件可執行檔案(作為二進位制檔案、shell 指令碼)進行呼叫。由於擴充套件可以在多個平臺上執行,這意味著您需要為您要支援的所有平臺提供可執行檔案。

瞭解有關擴充套件架構的更多資訊。

注意

只有作為擴充套件一部分提供的可執行檔案才能透過 SDK 呼叫。

在這個例子中,CLI 是一個簡單的 `Hello world` 指令碼,它必須帶引數呼叫並返回一個字串。

將可執行檔案新增到擴充套件

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

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

在另一個檔案 `binaries/windows/hello.cmd` 中為 Windows 建立一個 `batch 指令碼`,內容如下

@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` 必須引用容器內二進位制檔案的路徑。