呼叫主機二進位制檔案

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

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

但是,主機二進位制檔案從作為擴充套件的一部分交付並部署到主機的擴充套件可執行檔案(作為二進位制檔案、shell 指令碼)中呼叫。由於擴充套件可以在多個平臺上執行,因此這意味著您需要為要支援的所有平臺交付可執行檔案。

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

注意

只能呼叫作為擴充套件的一部分交付的可執行檔案。

在此示例中,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 客戶端物件 呼叫擴充套件提供的 shell 指令碼 使用 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 必須引用容器內部二進位制檔案的路徑。