Добавляет серверную часть в учебник по расширению

Ваше расширение может поставлять внутреннюю часть, с которой может взаимодействовать внешний интерфейс. На этой странице представлена информация о том, почему и как добавить серверную часть.

Прежде чем начать, убедиться, что у вас установлена последняя версия Docker Desktop.

Примечание

Проверяет Оператор по началу работы и docker extension init <my-extension>. Они обеспечивают лучшую основу для вашего расширения, поскольку оно более актуально и связано с вашей установкой Docker Desktop.

Зачем добавлять бэкенд?

Благодаря Docker Extensions SDK большую часть времени вы сможете делать то, что вам нужно, из интерфейса командной строки Docker непосредственно из интерфейс.

Тем не менее, в некоторых случаях вам может понадобиться добавить серверную часть к вашему расширению. До сих пор разработчики расширений использовали серверную часть для:

  • Сохраняйте данные в локальной базе данных и возвращайте их с помощью REST API.

  • Сохраняйте состояние расширения, например, когда кнопка запускает длительный процесс, чтобы, если вы уйдете из пользовательского интерфейса расширения и вернетесь, внешний интерфейс сможет продолжить работу с того места, где он остановился.

Дополнительные сведения о бэкэндах расширений см. в Архитектура.

Добавляет бэкенд к расширению

Если вы создали расширение с помощью команды docker extension init, у вас уже есть настройка серверной части. В противном случае необходимо сначала создать каталог vm, содержащий код, и обновить файл Dockerfile, чтобы поместить его в контейнер.

Вот структура папки расширения с бэкендом:

.
├── Dockerfile # (1)
├── Makefile
├── metadata.json
├── ui
    └── index.html
└── vm # (2)
    ├── go.mod
    └── main.go
  1. Содержит все необходимое для создания серверной части и её копирования в файловую систему контейнера расширения.

  2. Исходная папка, содержащая внутренний код расширения.

Хотя вы можете начать с пустого каталога или с 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. Заполнить форму и дайте нам знать, если вам нужен образец для Python.

  • Джава

    Важно

    У нас пока нет рабочего примера для Java. Заполнить форму и дайте нам знать, если вам нужен образец для Java.

  • .Сеть

    Важно

    У нас нет рабочего примера для .Net. Заполнить форму и дайте нам знать, если вам нужен образец для .Net.

Адаптируйте Dockerfile

Примечание

При использовании docker extension init создаётся Dockerfile, который уже содержит то, что необходимо для бэкенда Go.

  • Для 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
    
  • Для узла

Важно

У нас пока нет рабочего Dockerfile для Node. Заполнить форму и сообщить нам, хотите ли вы Dockerfile для Node.

  • Для Питона

Важно

У нас пока нет рабочего Dockerfile для Python. Заполнить форму и дайте нам знать, если вам нужен Dockerfile для Python.

  • Для Java

Важно

У нас пока нет рабочего Dockerfile для Java. Заполнить форму и сообщить нам, если вам нужен файл Dockerfile для Java.

  • .Для сети

Важно

У нас нет рабочего Dockerfile для .Net. Заполнить форму и сообщить нам, если вам нужен файл Dockerfile для .Net.

Настраивает файл метаданных

Чтобы запустить серверную службу вашего расширения внутри виртуальной машины Docker Desktop, вам необходимо настроить имя образа в разделе vm файла metadata.json.

{
  "vm": {
    "image": "${DESKTOP_PLUGIN_IMAGE}"
  },
  "icon": "docker.svg",
  "ui": {
    ...
  }
}

Для получения дополнительной информации о разделе vm metadata.json см. Метаданные.

Предупреждение

Не заменяйте заполнитель ${DESKTOP_PLUGIN_IMAGE} в файле metadata.json. Заполнитель автоматически заменяется правильным именем образа при установке расширения.

Вызвать бэкэнд расширения из вашего интерфейса

Используя расширенный пример расширения внешнего интерфейса, мы можем вызвать наш сервер расширения.

Используйте объект Docker Desktop Client, а затем вызвать маршрут /hello из серверной службы с ddClient. extension.vm.service.get, который возвращает текст ответа.

  • Реагировать

    // 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

Теперь вы можете видеть работающую серверную службу на вкладке *Containers8 панели управления Docker и просматривать журналы, когда вам нужно её отладить.

Примечание

Возможно, вам потребуется включить параметр Показывает системные контейнеры в Настройках, чтобы увидеть работающий серверный контейнер. См. Показывает контейнеры расширений для получения дополнительной информации.

Открывает панель инструментов Docker и выбрать вкладку Контейнеры. Вы должны увидеть ответ от вызова внутренней службы.

Что дальше?