向扩展添加后端
您的扩展可以附带一个后端部分,前端可以与其进行交互。 此页面提供有关为何以及如何添加后端的信息。
在开始之前,请确保您已安装最新版本的 Docker Desktop。
提示
查看快速入门指南和
docker extension init <my-extension>
。它们为您的扩展提供了更好的基础,因为它与您安装的 Docker Desktop 更为最新且相关。
为什么要添加后端?
借助 Docker 扩展 SDK,大多数情况下,您应该能够直接从 前端 执行您需要从 Docker CLI 执行的操作。
尽管如此,在某些情况下,您可能需要向扩展添加后端。 到目前为止,扩展构建者已使用后端来
- 将数据存储在本地数据库中,并使用 REST API 将它们提供回来。
- 存储扩展状态,例如当按钮启动长时间运行的进程时,这样如果您导航离开扩展用户界面并返回,则前端可以从中断处继续。
有关扩展后端的更多信息,请参阅 架构。
向扩展添加后端
如果您使用 docker extension init
命令创建了扩展,则您已经设置了后端。 否则,您必须首先创建一个包含代码的 vm
目录,并更新 Dockerfile 以将其容器化。
这是带有后端的扩展文件夹结构
.
├── Dockerfile # (1)
├── Makefile
├── metadata.json
├── ui
└── index.html
└── vm # (2)
├── go.mod
└── main.go
- 包含构建后端并将其复制到扩展的容器文件系统所需的一切。
- 包含扩展后端代码的源文件夹。
尽管您可以从一个空目录或 vm-ui extension
示例 开始,强烈建议您从 docker extension init
命令开始,并根据您的需求进行更改。
提示
docker extension init
会生成一个 Go 后端。但您仍然可以将其用作您自己扩展的起点,并使用任何其他语言,例如 Node.js、Python、Java、.Net 或任何其他语言和框架。
在本教程中,后端服务仅公开一个返回 JSON 负载“Hello”的路由。
{ "Message": "Hello" }
重要
我们建议前端和后端通过套接字(Windows 上为命名管道)而不是 HTTP 进行通信。这可以防止与主机上运行的任何其他应用程序或容器发生端口冲突。此外,某些 Docker Desktop 用户在受限环境中运行,无法在其计算机上打开端口。为后端选择语言和框架时,请确保它支持套接字连接。
package main
import (
"flag"
"log"
"net"
"net/http"
"os"
"github.com/labstack/echo"
"github.com/sirupsen/logrus"
)
func main() {
var socketPath string
flag.StringVar(&socketPath, "socket", "/run/guest/volumes-service.sock", "Unix domain socket to listen on")
flag.Parse()
os.RemoveAll(socketPath)
logrus.New().Infof("Starting listening on %s\n", socketPath)
router := echo.New()
router.HideBanner = true
startURL := ""
ln, err := listen(socketPath)
if err != nil {
log.Fatal(err)
}
router.Listener = ln
router.GET("/hello", hello)
log.Fatal(router.Start(startURL))
}
func listen(path string) (net.Listener, error) {
return net.Listen("unix", path)
}
func hello(ctx echo.Context) error {
return ctx.JSON(http.StatusOK, HTTPMessageBody{Message: "hello world"})
}
type HTTPMessageBody struct {
Message string
}
重要
我们还没有 Node 的工作示例。填写表单 并告诉我们您是否需要 Node 的示例。
重要
我们还没有 Python 的工作示例。填写表单