Поделиться через


Эмулятор на основе Linux (предварительная версия)

Следующее поколение эмулятора Azure Cosmos DB полностью основано на Linux и доступно в качестве контейнера Docker. Он поддерживает работу в различных процессорах и операционных системах.

Внимание

Эта версия эмулятора поддерживает только API для NoSQL в режиме шлюза с выбором подмножества функций. Дополнительные сведения см. в разделе поддержки функций.

Предварительные условия

Установка

Получение образа контейнера Docker с помощью docker pull. Образ контейнера публикуется в Реестр артефактов Microsoft как mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview.

docker pull mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview

Бег

Чтобы запустить контейнер, используйте docker run. Затем используйте docker ps для проверки того, запущен ли контейнер.

docker run --detach --publish 8081:8081 --publish 1234:1234 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview

docker ps
CONTAINER ID   IMAGE                                                             COMMAND                  CREATED         STATUS         PORTS                                                                                  NAMES
c1bb8cf53f8a   mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview  "/bin/bash -c /home/…"   5 seconds ago   Up 5 seconds   0.0.0.0:1234->1234/tcp, :::1234->1234/tcp, 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp   <container-name>

Примечание.

Эмулятор состоит из двух компонентов:

  • Обозреватель данных — интерактивное изучение данных в эмуляторе. По умолчанию это выполняется через порт 1234
  • Эмулятор Azure Cosmos DB — локальная версия службы базы данных Azure Cosmos DB. По умолчанию это выполняется через порт 8081.

Конечная точка шлюза эмулятора обычно доступна на порту 8081 по адресу http://localhost:8081. Чтобы перейти к обозревателе данных, используйте адрес http://localhost:1234 в веб-браузере. Для доступности обозревателя данных может потребоваться несколько секунд. Конечная точка шлюза обычно доступна немедленно.

Внимание

Пакеты SDK для .NET и Java не поддерживают режим HTTP в эмуляторе. Так как эта версия эмулятора начинается с HTTP по умолчанию, необходимо явно включить HTTPS при запуске контейнера (см. ниже). Для пакета SDK для Java также потребуется установить сертификаты.

docker run --detach --publish 8081:8081 --publish 1234:1234 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview --protocol https

Команды Docker

В следующей таблице приведены доступные команды Docker для настройки эмулятора. В этой таблице приведены соответствующие аргументы, переменные среды, допустимые значения, параметры по умолчанию и описания каждой команды.

Требование Arg Env Допустимые значения По умолчанию. Описание
Печать параметров в stdout из контейнера --help, -h Неприменимо Неприменимо Неприменимо Отображение сведений о доступной конфигурации
Установка порта конечной точки Cosmos --port [INT] ПОРТ INT 8081 Порт конечной точки Cosmos в контейнере. Вам по-прежнему нужно опубликовать этот порт (например, -p 8081:8081).
Укажите протокол, используемый конечной точкой Cosmos --protocol ПРОТОКОЛ https, , httphttps-insecure http Протокол конечной точки Cosmos в контейнере.
Включение обозревателя данных --enable-explorer ENABLE_EXPLORER true, false true Включите запуск обозревателя данных Cosmos в одном контейнере.
Установка порта, используемого обозревателем данных --explorer-port EXPLORER_PORT INT 1 234 Порт обозревателя данных Cosmos в контейнере. Вам по-прежнему нужно опубликовать этот порт (например, -p 1234:1234).
Пользователь должен иметь возможность указать протокол, используемый обозревателем, в противном случае используется конечная точка Cosmos. --explorer-protocol EXPLORER_PROTOCOL https, http, https-insecure <the value of --protocol> Протокол обозревателя данных Cosmos в контейнере. По умолчанию используется параметр протокола в конечной точке Cosmos.
Укажите ключ через файл --key-file [PATH] KEY_FILE ПУТЬ <default secret> Замените ключ по умолчанию на ключ, указанный в файле. Необходимо подключить этот файл к контейнеру (например, если KEY_FILE=/mykey, вы добавите следующий параметр к команде docker run: --mount type=bind,source=./myKey,target=/myKey)
Задайте путь к данным --data-path [PATH] DATA_PATH ПУТЬ /data Укажите каталог для данных. Часто используется с docker run --mount параметром (например, если DATA_PATH=/usr/cosmos/data, вы добавите следующий параметр в выполнение docker: --mount type=bind,source=./.local/data,target=/usr/cosmos/data
Укажите путь сертификата, используемый для https --cert-path [PATH] CERT_PATH ПУТЬ <default cert> Укажите путь к сертификату для защиты трафика. Необходимо подключить этот файл в контейнер (например, если CERT_PATH=/mycert.pfx, добавьте следующую опцию при запуске Docker: --mount type=bind,source=./mycert.pfx,target=/mycert.pfx)
Укажите секрет сертификата, используемый для https Неприменимо CERT_SECRET строка <default secret> Секрет сертификата, указанного в CERT_PATH.
Настройка уровня журнала --log-level [LEVEL] LOG_LEVEL quiet error, warn, info, debug, trace info Уровень подробности журналов, создаваемых эмулятором и обозревателем данных.
Включение отправки диагностических сведений в корпорацию Майкрософт --enable-telemetry ВКЛЮЧИТЬ_ТЕЛЕМЕТРИЮ true, false true Включите отправку журналов в корпорацию Майкрософт, чтобы помочь нам улучшить эмулятор.

Поддержка функций

Этот эмулятор находится в активной разработке и предварительной версии. В результате поддерживаются не все функции Azure Cosmos DB. Некоторые функции также не будут поддерживаться в будущем. Эта таблица включает состояние различных функций и их уровень поддержки.

Функция Поддержка
API пакетной службы ✅ Поддерживается
Массовый API ✅ Поддерживается
Лента изменений ⚠️ Пока не реализовано
Создание и чтение документа с данными utf ✅ Поддерживается
Создание коллекции ✅ Поддержка
Конфликт из-за двойного создания коллекции ✅ Поддерживается
Создание коллекции с помощью настраиваемой политики индекса ⚠️ Пока не реализовано
Создание коллекции с истечением срока действия TTL ⚠️ Пока не реализовано
Создание базы данных ✅ Поддерживается
Создание базы данных дважды конфликтует ✅ Поддержанный
Создание документа ✅ Поддерживается
Создание секционированных коллекций ⚠️ Пока не реализовано
Удаление коллекции ✅ Поддерживается
Удаление базы данных ✅ Поддерживается
Удаление документа ✅ Поддерживается
Получение и изменение производительности коллекции ⚠️ Пока не реализовано
Вставка большого документа ✅ Поддерживается
Документ исправления ⚠️ Пока не реализовано
Параллельное выполнение запросов к секционированной коллекции ⚠️ Пока не реализовано
Запрос с агрегатными функциями ⚠️ Пока не реализовано
Запрос с фильтрацией ⚠️ Пока не реализовано
Запрос с фильтрацией и проекцией ⚠️ Пока не реализовано
Запрос с равенством ✅ Поддержанный
Запрос с условием равенства по идентификатору ✅ Поддерживается
Запрос с соединениями ⚠️ Пока не реализовано
Запрос с сортировкой по ✅ Поддержанный
Запрос с порядком для секционированных коллекций ⚠️ Пока не реализовано
Запрос с порядком по числам ✅ Поддержанный
Запрос с порядком по строкам ⚠️ Пока не реализовано
Запрос с разбиением по страницам ⚠️ Пока не реализовано
Запрос с использованием операторов диапазона для дат и времени ⚠️ Пока не реализовано
Запрос с диапазонными операторами по числам ⚠️ Пока не реализовано
Запрос с операторами диапазона в строках ⚠️ Пока не реализовано
Запрос с одним соединением ⚠️ Пока не реализовано
Запрос с помощью строковых математических и массивных операторов ⚠️ Пока не реализовано
Запрос с вложенными документами ⚠️ Пока не реализовано
Запрос с двумя соединениями ⚠️ Пока не реализовано
Запрос с двумя соединениями и фильтром ⚠️ Пока не реализовано
Прочитать коллекцию ✅ Поддерживается
Чтение ленты коллекции ⚠️ Пока не реализовано
Чтение базы данных ✅ Поддерживается
Чтение потока данных базы данных ⚠️ Пока не реализовано
Чтение документа ✅ Поддерживается
Чтение потока документов ✅ Поддержанный
Замена документа ✅ Поддержанный
Единицы запросов ⚠️ Пока не реализовано
Хранимые процедуры ❌ Не запланировано
Триггеры ❌ Не запланировано
Определяемые пользователем функции ❌ Не запланировано
Обновление коллекции ⚠️ Пока не реализовано
Обновление документа ✅ Поддержанный

Ограничения

Помимо функций, которые еще не поддерживаются или не запланированы, в следующем списке содержатся текущие ограничения эмулятора.

  • Пакет SDK для .NET для Azure Cosmos DB не поддерживает массовое выполнение в эмуляторе.
  • Пакеты SDK для .NET и Java не поддерживают режим HTTP в эмуляторе.

Установка сертификатов для пакета SDK для Java

При использовании пакета SDK Java для Azure Cosmos DB с этой версией эмулятора в режиме https необходимо установить сертификаты в локальном хранилище доверия Java.

Получение сертификата

В окне выполните следующую bash команду:

# If the emulator was started with /AllowNetworkAccess, replace localhost with the actual IP address of it:
EMULATOR_HOST=localhost
EMULATOR_PORT=8081
EMULATOR_CERT_PATH=/tmp/cosmos_emulator.cert
openssl s_client -connect ${EMULATOR_HOST}:${EMULATOR_PORT} </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > $EMULATOR_CERT_PATH

Установка сертификата

Перейдите в каталог установки java, где cacerts находится файл (замените ниже правильным каталогом):

cd "C:/Program Files/Eclipse Adoptium/jdk-17.0.10.7-hotspot/bin"

Импортируйте сертификат (вам может потребоваться пароль, значение по умолчанию — changeit):

keytool -cacerts -importcert -alias cosmos_emulator -file $EMULATOR_CERT_PATH

Если вы получите ошибку, так как псевдоним уже существует, удалите его, а затем снова запустите приведенный выше код:

keytool -cacerts -delete -alias cosmos_emulator

Использование в рабочем процессе непрерывной интеграции

Существует множество преимуществ использования контейнеров Docker в конвейерах CI/CD, особенно для систем с отслеживанием состояния, таких как базы данных. Это может быть с точки зрения экономичности, производительности, надежности и согласованности наборов тестов.

Эмулятор может быть включен в составе конвейеров CI/CD. Вы можете обратиться к этому репозиторию GitHub , который содержит примеры использования эмулятора в рамках рабочего процесса CI GitHub Actions для .NET, Python, Java и Go приложений в обоих x64 и ARM64 архитектурах (демонстрируется для запуска Linux с помощью ubuntu).

Ниже приведен пример рабочего процесса CI GitHub Actions, который показывает, как настроить эмулятор в качестве контейнера службы GitHub Actions в рамках задания в рабочем процессе. GitHub заботится о запуске контейнера Docker и уничтожает его после завершения задания без необходимости ручного вмешательства (например, с помощью docker run команды).

name: CI demo app

on:
  push:
    branches: [main]
    paths:
      - 'java-app/**'
  pull_request:
    branches: [main]
    paths:
      - 'java-app/**'

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    services:
      cosmosdb:
        image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
        ports:
          - 8081:8081
        env:
          PROTOCOL: https
        
    env:
      COSMOSDB_CONNECTION_STRING: ${{ secrets.COSMOSDB_CONNECTION_STRING }}
      COSMOSDB_DATABASE_NAME: ${{ vars.COSMOSDB_DATABASE_NAME }}
      COSMOSDB_CONTAINER_NAME: ${{ vars.COSMOSDB_CONTAINER_NAME }}

    steps:

      - name: Set up Java
        uses: actions/setup-java@v3
        with:
          distribution: 'microsoft'
          java-version: '21.0.0'

      - name: Export Cosmos DB Emulator Certificate
        run: |

          sudo apt update && sudo apt install -y openssl

          openssl s_client -connect localhost:8081 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cosmos_emulator.cert

          cat cosmos_emulator.cert

          $JAVA_HOME/bin/keytool -cacerts -importcert -alias cosmos_emulator -file cosmos_emulator.cert -storepass changeit -noprompt
      
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Run tests
        run: cd java-app && mvn test

Это задание выполняется в средстве выполнения Ubuntu и использует mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview образ Docker в качестве контейнера службы. Он использует переменные среды для настройки строки подключения, имени базы данных и имени контейнера. Так как в этом случае задание выполняется непосредственно на компьютере runner GitHub Actions, шаг выполнения тестов в задании, может получить доступ к эмулятору, который доступен через localhost:8081 (8081 является портом, предоставляемым эмулятором).

Шаг "Экспорт сертификата эмулятора Cosmos DB " зависит от приложений Java, так как пакет SDK Java для Azure Cosmos DB в настоящее время не поддерживает HTTP режим в эмуляторе. Переменная PROTOCOL среды задана https в services разделе, и этот шаг экспортирует сертификат эмулятора и импортирует его в хранилище ключей Java. Это же относится и к .NET.

Создание отчетов о проблемах

При возникновении проблем с использованием этой версии эмулятора откройте проблему в репозитории GitHub (https://github.com/Azure/azure-cosmos-db-emulator-docker) и пометьте ее меткой cosmosEmulatorVnextPreview.