Не удается подключиться к азуриту с использованием имени хоста - PullRequest
0 голосов
/ 06 января 2020

Как я могу подключиться к азуриту, используя имя хоста?

Я пытаюсь эмулировать Azure Хранилище больших двоичных объектов в docker, используя Azurite для интеграционных тестов.

Все работает хорошо, к этому моменту я должен получить доступ к Azurite через имя хоста (которое AFAIK требуется для docker работы в сети)

Моя строка подключения выглядит следующим образом (это стандартная строка подключения по умолчанию):

"AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;DefaultEndpointsProtocol=http;BlobEndpoint=http://azurite:10000/devstoreaccount1;"

Моя docker составная часть для азурита выглядит следующим образом:

services:
  azurite:
    image: mcr.microsoft.com/azure-storage/azurite
    hostname: azurite
    command: "azurite-blob --loose --blobHost 0.0.0.0"
    ports:
      - "10000:10000"
    volumes:
      - ./test/azurite:/data
    networks:
      - stillsnet

  images:
    container_name: images
    image: myapp/images
    build:
      context: .
      dockerfile: Dockerfile
    ports:
       - "5000:5000"
       - "5001:5001"
    environment:
      - ASPNETCORE_ENVIRONMENT=Test
      - ASPNETCORE_URLS=http://+:5000
      - imagesStorage__AzureBlobStorage__ConnectionString=AccountName=devstoreaccount1;DefaultEndpointsProtocol=http;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite:10000;
    depends_on:
      - azurite
    links:
      - azurite
    networks:
      - stilssnet

мой код выглядит следующим образом:

private const string ConnectionString ="AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;DefaultEndpointsProtocol=http;BlobEndpoint=http://azurite:10000/devstoreaccount1;";

[Fact]
public async Task UploadFile()
{
   var container = new BlobContainerClient(ConnectionString, "images");
   await using var stream = File.OpenRead(@"C:\temp\output\3ee9bc41-40ea-4d05-b180-e74bd5065622\images\00000000.jpg");
   await container.UploadBlobAsync("test.jpg", stream);
}

это приведет к исключение:

System.Xml.XmlException : Root element is missing.
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options)
   at System.Xml.Linq.XDocument.Load(Stream stream, LoadOptions options)
   at Azure.Storage.Blobs.BlobRestClient.Container.CreateAsync_CreateResponse(Response response)
   at Azure.Storage.Blobs.BlobRestClient.Container.CreateAsync(ClientDiagnostics clientDiagnostics, HttpPipeline pipeline, Uri resourceUri, PublicAccessType access, Nullable`1 timeout, IDictionary`2 metadata, String requestId, Boolean async, String operationName, CancellationToken cancellationToken)
   at Azure.Storage.Blobs.BlobContainerClient.CreateInternal(PublicAccessType publicAccessType, IDictionary`2 metadata, Boolean async, CancellationToken cancellationToken, String operationName)
   at Azure.Storage.Blobs.BlobContainerClient.CreateIfNotExistsInternal(PublicAccessType publicAccessType, IDictionary`2 metadata, Boolean async, CancellationToken cancellationToken)
   at Azure.Storage.Blobs.BlobContainerClient.CreateIfNotExistsAsync(PublicAccessType publicAccessType, IDictionary`2 metadata, CancellationToken cancellationToken)

Если изменить строку подключения с azurite на 127.0.0.1, все будет работать нормально.

Ответы [ 3 ]

0 голосов
/ 07 января 2020

Похоже, что BlobContainerClient сам удаляет имя учетной записи из URL-адреса, если вы используете что-то кроме localhost или IP-адреса, поэтому клиент генерирует это:

"PUT / images? Restype = container HTTP /1.1 "400 - вместо" PUT / devstoreaccount1 / images? Restype = container "HTTP / 1.1 201

В качестве неприятного обходного пути мы можем включить имя учетной записи в имя контейнера при тестировании на азурит: var container = новый BlobContainerClient (ConnectionString, "devstoreaccount1 / images");

Хоть и ждите container.CreateIfNotExistsAsyn c (); тогда не работает должным образом против азурита (генерирует исключение 409, когда оно уже существует ...

Так что у нас либо есть:

  • уродливый хак
  • сброс azurite в пользу реальной учетной записи для хранения больших двоичных объектов
  • , отбрасывающей BlobContainerClient, который, кажется, выполняет слишком много магических операций c в зависимости от имени хоста.

Похоже, это не так. связаны с самим Azurite или, в идеале, должны поддерживать root URL-адреса, совместимые с хранилищем BLOB-объектов Azure, без указания префикса имени учетной записи.

0 голосов
/ 08 января 2020

Я использую сервер Sql и Azurite. Я просто использую docker compose, чтобы запустить их. Обратите внимание на перезагрузку: всегда. это запустит контейнеры при запуске docker. Это похоже на запуск установленного azure эмулятора хранилища.

version: "2"

services:

  sql-server-db:
    container_name: sql-server-db
    image: microsoft/mssql-server-linux:2017-latest
    restart: always
    ports:
      - "1433:1433"
      - "1434:1434"
    environment:
      SA_PASSWORD: "<EnterYourPasswordHere!!!>"
      ACCEPT_EULA: "Y"

  azure_storage_emulator:
    container_name: azurite
    image: mcr.microsoft.com/azure-storage/azurite
    restart: always
    ports:
      - "10001:10001"
      - "10000:10000"
0 голосов
/ 07 января 2020

Я запустил азурит с помощью этой команды (со страницы docker концентратор https://hub.docker.com/_/microsoft-azure-storage-azurite?tab=description)

docker run -p 10000: 10000 -p 10001: 10001 мкр. microsoft.com/azure-storage/azurite

мой конфигурационный файл просто так:

<add name="BlobStorage" connectionString="UseDevelopmentStorage=true" />

в разделе connectionStrings (со страницы: https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azurite#install -и -run-на-azurite- docker -изображением )

...