调用宿主机Binaries
在某些情况下,您的扩展可能需要在主机上调用某些命令。例如,您可能希望调用云服务商的 CLI 来创建新资源,或者是您的扩展提供的工具 CLI,甚至是您想在主机上运行的 Shell 脚本。
您可以通过从带有扩展 SDK 的容器中执行 CLI 来实现这一点。但此 CLI 需要访问宿主机的文件系统,如果它在容器中运行,这既不容易也不快速。
然而,主机Binaries是从扩展可执行文件(作为Binaries、shell 脚本)调用的,这些文件作为扩展的一部分提供并部署到主机上。由于扩展可以在多个平台上运行,这意味着您需要为您想要支持的所有平台提供相应的可执行文件。
了解更多关于扩展的信息 架构。
注意
只有作为扩展一部分提供的可执行文件才能通过 SDK 调用。
在此示例中,CLI 是一个简单的 Hello world 脚本,必须带参数调用并返回一个字符串。
将可执行文件添加到扩展
在文件 binaries/unix/hello.sh 中为 macOS 和 Linux 创建一个 bash 脚本,内容如下:
#!/bin/sh
echo "Hello, $1!"在另一个文件 binaries/windows/hello.cmd 中为 Windows 创建一个包含以下内容的 batch script:
@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 脚本。在此示例中,Binaries在扩展视图渲染后立即返回一个字符串作为结果,该结果通过 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 文件中指定主机Binaries,以便 Docker Desktop 在安装扩展时将其复制到主机上。一旦卸载扩展,复制的Binaries也会被删除。
{
"vm": {
...
},
"ui": {
...
},
"host": {
"binaries": [
{
"darwin": [
{
"path": "/darwin/hello.sh"
}
],
"linux": [
{
"path": "/linux/hello.sh"
}
],
"windows": [
{
"path": "/windows/hello.cmd"
}
]
}
]
}
}path 必须引用容器内Binaries的路径。