Как заставить минио-клиента (с хоста) взаимодействовать с минио-сервером (контейнер docker)?

#python #python-2.7 #docker-compose #ubuntu-16.04 #minio

#python #python-2.7 #docker-compose #ubuntu-16.04 #минио

Вопрос:

Я запускаю мини-сервер в контейнере docker-compose. Я пытаюсь загрузить файл на минио-сервер в контейнере с хост-компьютера (Ubuntu) (вместо контейнера) с помощью минио-клиента (python SDK). Я не сделал так, как ожидалось. Мне не ясно, связано ли это с моей конечной точкой (URL) или из-за проблемы с подключением между контейнером и хостом?

Конечные точки, которые я пробовал:

url_1 = ‘http://minio:9000 ‘ # из моей настройки по умолчанию для minio link;

url_2 = ‘http://localhost:9000/minio/test ‘ # из браузера Minio.

Для url_1 я получил следующее: «botocore.exceptions.Ошибка EndpointConnectionError: не удалось подключиться к URL конечной точки: http://minio:9000/test «. Строка ошибки: s3.create_bucket(Bucket=’test’)

Для url_2 я получил следующее: » Весь доступ к этому пакету был отключен «. Строка ошибки: s3.create_bucket(Bucket=’test’)

Я попробовал аналогичную вещь: активировать мой минио-сервер и минио-клиент на моем хост-компьютере. Затем я загружаю файл с минио-клиента на минио-сервер. Я могу видеть эти загруженные файлы в браузере Minio на localhost.

######### скрипт python, загружающий файлы

 import boto3

from botocore.client import Config

import os

import getpass

my_url1='http://minio:9000' # this is from os.environ['S3_URL']
my_url2='http://localhost:9000/minio/test' # this is from browser

s3 = boto3.resource('s3',
                endpoint_url=my_url2,
                aws_access_key_id=os.environ['USER'],
                aws_secret_access_key = getpass.getpass('Password:'),
                config = Config(signature_version='s3v4'),
                region_name='us-east-1')

print ('********', s3)

s3.create_bucket(Bucket='test')

uploadfile= os.getcwd() '/' 'test.txt'
s3.Bucket('testBucket').upload_file(uploadfile,'txt')
  

######### docker-yml-файл для Minio

 minio:
   image: minio/minio
   entrypoint:
      - minio
      - server
      -/data
   ports:
      - "9000:9000"
   environment:
      minio_access_key = username
      minio_secret_key = password

mc:
   image: minio/mc
   environment: 
      minio_access_key = username
      minio_secret_key = password
   entrypoint:
      /bin/sh -c     
   depends_on:
      minio
  

я ожидал увидеть загруженные файлы из браузера minio (‘http://localhost:9000/minio/test ‘) , точно так же, как я сделал, активировав минио-сервер и минио-клиент на хосте.

Ответ №1:

При использовании сети docker по умолчанию вам пришлось бы попытаться получить доступ к minio поhttp://localhost:9000 на вашем хосте. Итак, вы можете просто использовать этот URL в своем скрипте на Python. http://minio:9000 будет работать из контейнеров в той же сети docker, что и ваш минио-сервер.

Ответ №2:

Попробуйте использовать клиент Pyminio вместо boto3.

 import os
from pyminio import Pyminio

pyminio_client = Pyminio.from_credentials(
    endpoint='http://localhost:9000/',
    access_key=os.environ['USER'],
    secret_key=getpass.getpass('Password:')
)

pyminio_client.mkdirs('/test/')

pyminio_client.put_file(
    to_path='/test/',
    file_path=os.path.join(os.getcwd(), 'test.txt')
)
  

Ответ №3:

используйте эту конфигурацию в вашем файле compose.yml

 version: "3"
services:
    
    minio:
        image: "minio/minio"
        container_name: mi
        ports:
            - "9000:9000"
        environment:
            - "MINIO_ACCESS_KEY=ACCRESS"
            - "MINIO_SECRET_KEY=SECRET"
        restart: always
        command: server /data
    mc:
        image: minio/mc
        container_name: mc
        network_mode: host
        entrypoint: >
          /bin/sh -c "
          /usr/bin/mc config host add minio http://127.0.0.1:9000 ACCESS SECRET;
          /usr/bin/mc rm -r --force minio/psb-new;
          /usr/bin/mc mb minio/psb-new;
          /usr/bin/mc policy set public minio/psb-new;
          exit 0;
          "
networks:
  elastic:
    driver: bridge