Как получить доступ к объектному хранилищу Minio на хосте компьютера из контейнера docker?

Проблема

У меня есть проект с микросервисной архитектурой и в нем я использую S3-совместимое хранилище Minio. Я столкнулся с проблемой, что при обращении к объектному хранилищу AWSClient отправляет запрос по адресу http://<bucket-name>.minio. Мои контейнеры находятся в сети типа bridge, поэтому сервис, отправляющий запрос, должен сопоставить хост имени контейнера с его адресом, но не может это сделать из-за префикс <bucket-name>.

Что я пытался сделать

Принудительный путь в url

Сначала я нашел свойство ForcePathStyle в классе AmazonS3Config, которое отвечает за принудительную path-style адресацию. Но проблема в том, что я внедряю IAmazonS3 через DI и могу передать в метод привязки только AWSOptions, с вложенным в него ClientConfig, который не имеет данного свойства.

Запуск хранилища на локальном хосте

Далее я запустил хранилище Minio в отдельной сети и сопоставил его порты с хостом моей машины. В файле docker-compose добавил хосты для возможности доступа к "localhost моего компьютера":

    extra_hosts:
      - "<bucket-name>.host.docker.internal:host-gateway"
      - "host.docker.internal:host-gateway"

От части это сработало, теперь я могу получить доступ к хранилищу, но появилась другая проблема. Мой код выбрасывает исключение: Amazon.S3.AmazonS3Exception: The specified bucket is not valid.. При этом, если я обращаюсь к этому же bucket`у из сервиса, который запущен прямо на моей локальной машине, то все работает отлично.

Мне кажется, что проблема где-то в сопоставлении хостов. Скорее всего префикс <bucket-name> просто теряется. Но я не могу понять как это отладить и отследить. Возможно, есть какой-то более удобный способ для того чтобы связать мой сервис и объектную БД.

Мой код

Мой docker-compose:

 ...

  minio:
    image: minio/minio
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - minio_storage:/data
    environment:
      MINIO_ROOT_USER: storage-api
      MINIO_ROOT_PASSWORD: 12345678
    command: server --console-address ":9001" /data
    container_name: minio    

 ...

  storageservice:
    container_name: shked-storage-service
    image: wayne301/shked-storageservice:dev
    restart: always
    ports:
      - "130:130"
    environment:
      - ASPNETCORE_ENVIRONMENT=Docker
      - ASPNETCORE_URLS=http://+:130/
    networks:
      - shked-dev
    extra_hosts:
      - "shked-tasks.host.docker.internal:host-gateway"
      - "host.docker.internal:host-gateway"

 ...

Конфигурация моего сервиса

{
  "AWS": {
   "AccessKey": "tasks-service",
    "SecretKey": "12345678",
    "ServiceUrl": "http://host.docker.internal:9000",
    "BucketName": "shked-tasks"
  }
}

UPD:

Проблему с исключением я пофиксил. Оказывается minio по-умолчанию поддерживает только path-style адресацию. Чтобы использовать virtual host адресацию нужно добавить следующую переменную среды:

MINIO_DOMAIN=mydomain.com

Вопрос как мне получить доступ к хранилищу внутри сети docker, чтобы не городить костыли с docker.internal.host, остается открытым.


Ответы (0 шт):