Как получить доступ к объектному хранилищу 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, остается открытым.