為您的擴充套件新增後端
您的擴充套件可以交付一個後端部分,前端可以與之互動。此頁面提供有關為什麼以及如何新增後端的資訊。
在開始之前,請確保您已安裝最新版本的 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 或任何其他語言和框架。
在本教程中,後端服務只公開一個路由,該路由返回一個表示“Hello”的 JSON 負載。
{ "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 的工作示例。 填寫表格 並告知我們您是否需要 Python 的示例。
重要
我們還沒有 Java 的工作示例。 填寫表格 並告知我們您是否需要 Java 的示例。
重要
我們還沒有 .NET 的工作示例。 填寫表格 並告知我們您是否需要 .NET 的示例。
調整 Dockerfile
注意
使用
docker extension init
時,它會建立一個Dockerfile
,其中已經包含 Go 後端所需的內容。
要部署 Go 後端以安裝擴充套件,您首先需要配置 Dockerfile
,以便它
- 構建後端應用程式
- 將二進位制檔案複製到擴充套件的容器檔案系統中
- 容器啟動時,啟動二進位制檔案以監聽擴充套件套接字
提示
為了簡化版本管理,您可以重複使用相同的映象來構建前端、構建後端服務以及打包擴充套件。
# syntax=docker/dockerfile:1
FROM node:17.7-alpine3.14 AS client-builder
# ... build frontend application
# Build the Go backend
FROM golang:1.17-alpine AS builder
ENV CGO_ENABLED=0
WORKDIR /backend
COPY vm/go.* .
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
go mod download
COPY vm/. .
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
go build -trimpath -ldflags="-s -w" -o bin/service
FROM alpine:3.15
# ... add labels and copy the frontend application
COPY --from=builder /backend/bin/service /
CMD /service -socket /run/guest-services/extension-allthethings-extension.sock
重要
我們還沒有 Node 的工作 Dockerfile。 填寫表格 並告知我們您是否需要 Node 的 Dockerfile。
重要
我們還沒有 Python 的工作 Dockerfile。 填寫表格 並告知我們您是否需要 Python 的 Dockerfile。
重要
我們還沒有一個可用的 Java Dockerfile。填寫表格,如果您需要 Java 的 Dockerfile,請告知我們。
重要
我們還沒有一個可用的 .Net Dockerfile。填寫表格,如果您需要 .Net 的 Dockerfile,請告知我們。
配置元資料檔案
要在 Docker Desktop 的 VM 中啟動擴充套件的後端服務,您需要在 metadata.json
檔案的 vm
部分配置映象名稱。
{
"vm": {
"image": "${DESKTOP_PLUGIN_IMAGE}"
},
"icon": "docker.svg",
"ui": {
...
}
}
有關 metadata.json
的 vm
部分的更多資訊,請參閱元資料。
警告
不要替換
metadata.json
檔案中的${DESKTOP_PLUGIN_IMAGE}
佔位符。安裝擴充套件時,將自動用正確的映象名稱替換此佔位符。
從前端呼叫擴充套件後端
使用高階前端擴充套件示例,我們可以呼叫我們的擴充套件後端。
使用 Docker Desktop 客戶端物件,然後使用 ddClient.extension.vm.service.get
從後端服務呼叫 /hello
路由,該路由返回響應的主體。
將 ui/src/App.tsx
檔案替換為以下程式碼
// ui/src/App.tsx
import React, { useEffect } from 'react';
import { createDockerDesktopClient } from "@docker/extension-api-client";
//obtain docker destkop extension client
const ddClient = createDockerDesktopClient();
export function App() {
const ddClient = createDockerDesktopClient();
const [hello, setHello] = useState<string>();
useEffect(() => {
const getHello = async () => {
const result = await ddClient.extension.vm?.service?.get('/hello');
setHello(JSON.stringify(result));
}
getHello()
}, []);
return (
<Typography>{hello}</Typography>
);
}
重要
我們還沒有 Vue 的示例。填寫表格,如果您需要 Vue 的示例,請告知我們。
重要
我們還沒有 Angular 的示例。填寫表格,如果您需要 Angular 的示例,請告知我們。
重要
我們還沒有 Svelte 的示例。填寫表格,如果您需要 Svelte 的示例,請告知我們。
重新構建擴充套件並更新它
由於您修改了擴充套件的配置並在 Dockerfile 中添加了一個階段,因此您必須重新構建擴充套件。
docker build --tag=awesome-inc/my-extension:latest .
構建完成後,您需要更新它,或者如果尚未安裝,則安裝它。
docker extension update awesome-inc/my-extension:latest
現在您可以在 Docker 儀表板的 *容器8 選項卡中看到後端服務正在執行,並在需要除錯時檢視日誌。
提示
您可能需要在 設定 中啟用 顯示系統容器 選項才能看到正在執行的後端容器。有關更多資訊,請參閱顯示擴充套件容器。
開啟 Docker 儀表板並選擇 容器 選項卡。您應該看到顯示的後端服務呼叫響應。
下一步是什麼?
- 瞭解如何共享和釋出您的擴充套件。
- 瞭解有關擴充套件的更多資訊架構。