调用主机二进制文件
在某些情况下,你的扩展可能需要调用主机上的某些命令。例如,你可能想要调用云提供商的 CLI 来创建新的资源,或者调用扩展提供的工具的 CLI,甚至是你想要在主机上运行的 shell 脚本。
你可以通过使用扩展 SDK 从容器中执行 CLI 来实现。但是,如果 CLI 在容器中运行,它需要访问主机的文件系统,这既不容易也不快。
但是,主机二进制文件是从作为扩展的一部分提供的可执行文件(作为二进制文件、shell 脚本)调用的,并部署到主机。由于扩展可以在多个平台上运行,这意味着你需要为所有你想要支持的平台提供可执行文件。
了解更多关于扩展的架构信息。
注意
只有作为扩展一部分提供的可执行文件才能使用 SDK 调用。
在这个例子中,CLI 是一个简单的 `Hello world` 脚本,必须使用参数调用并返回一个字符串。
将可执行文件添加到扩展
为 macOS 和 Linux 创建一个 `bash` 脚本,文件名为 `binaries/unix/hello.sh`,内容如下:
#!/bin/sh
echo "Hello, $1!"
为 Windows 创建一个 `批处理脚本`,文件名为 `binaries/windows/hello.cmd`,内容如下:
@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` 必须引用容器内二进制文件的路径。