调用主机二进制文件

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

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

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

详细了解扩展体系结构

注意

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

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

将可执行文件添加到扩展


在文件中创建适用于 macOS 和 Linux 的脚本,其中包含以下内容:bashbinaries/unix/hello.sh

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

在另一个文件中创建一个 for Windows,其中包含以下内容:batch scriptbinaries/windows/hello.cmd

@echo off
echo "Hello, %1!"

然后更新 以将文件夹复制到扩展的容器文件系统中,并使 files 可执行。Dockerfilebinaries

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


配置元数据文件

必须在文件中指定主机二进制文件,以便 Docker Desktop 在安装时将其复制到主机上 扩展。卸载扩展后,复制的二进制文件也会被删除。metadata.json

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

必须引用容器内二进制文件的路径。path