调用主机Binaries

在某些情况下,您的扩展可能需要从主机调用某些命令。例如,您 可能想要调用云提供商的 CLI 来创建新资源,或者调用扩展的工具的 CLI 提供,甚至是要在主机上运行的 shell 脚本。

您可以通过使用扩展 SDK 从容器执行 CLI 来执行此作。但是这个 CLI 需要访问主机的文件系统,如果它在容器中运行,这既不容易也不快速。

但是,主机Binaries从扩展可执行文件中调用(作为Binaries、shell 脚本) 作为扩展的一部分提供并部署到主机。由于扩展可以在多个平台上运行,因此 意味着您需要为要支持的所有平台提供可执行文件。

详细了解扩展体系结构

注意

只有作为扩展的一部分提供的可执行文件才能使用 SDK 调用。

在此示例中,CLI 是一个简单的Hello world脚本,该脚本必须使用参数调用,并返回 字符串。

将可执行文件添加到扩展


创建一个bashscript 的 macOS,在binaries/unix/hello.sh包含以下内容:

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

创建一个batch script对于 Windows,则位于另一个文件中binaries/windows/hello.cmd包含以下内容:

@echo off
echo "Hello, %1!"

然后更新Dockerfile要将binaries文件夹添加到扩展的容器文件系统中,并将 files 可执行。

# 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 对象调用扩展提供的 shell 脚本,其中包含ddClient.extension.host.cli.exec()功能。 在此示例中,Binaries返回一个字符串作为结果,由result?.stdout,一旦 Extension 视图被渲染。


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 的样品。


配置元数据文件

主机Binaries必须在metadata.json文件,以便 Docker Desktop 在安装时将它们复制到主机上 扩展。卸载扩展后,复制的Binaries也会被删除。

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

path必须引用容器内Binaries的路径。