从我的Django应用程序拒绝了Minio Docker实例的连接

问题描述

您好,我试图从Django实例连接到也在Docker容器内运行的Minio实例,而django实例也在docker容器内运行。

我不断收到此错误

2020-10-29 13:59:17,568 urllib3.util.retry DEBUG    Incremented Retry for (url='/'): Retry(total=0,connect=None,read=None,redirect=None,status=None)
2020-10-29 13:59:20,773 urllib3.connectionpool WARNING  retrying (Retry(total=0,status=None)) after connection broken by 'SSLError(SSLError(1,'[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1076)'))': /
2020-10-29 13:59:20,774 urllib3.connectionpool DEBUG    Starting new HTTPS connection (6): minio:9000

我的docker-compose文件如下:

version: "3.7"

services:
    db:
        container_name: db
        image: mariadb
        restart: always
        ports:
          - '3306:3306'
        environment:
          MysqL_DATABASE: 'django_dev'
          MysqL_USER: 'user'
          MysqL_PASSWORD: 'password'
          MysqL_ROOT_PASSWORD: 'password'
        volumes:
          - ./mariadb:/var/lib/MysqL

    minio:
        container_name: minio
        image: minio/minio
        command: 'server /export'
        environment: 
          MINIO_ACCESS_KEY: weak_access_key
          MINIO_SECRET_KEY: weak_secret_key
        ports:
          - '9000:9000'
        volumes:
          - ./minio:/export

    web:
        container_name: web
        build: 
          context: ./django/
          dockerfile: ./Dockerfile
          target: dev
        command: python manage.py runserver 0.0.0.0:8000
        volumes: 
          - ./django:/usr/src/app
        ports:
          - "8000:8000"
        env_file: 
          - ./.env.dev
        depends_on:
          - minio
          - db

    PHPmyadmin:
        container_name: db_viewer
        image: PHPmyadmin/PHPmyadmin
        restart: always
        ports:
          - '8080:80'
        environment:
          PMA_HOST: db
          MysqL_ROOT_PASSWORD: 'password'
        depends_on:
          - db

设置客户端的代码

minioClient = Minio('minio:9000',access_key='weak_access_key',secret_key='weak_secret_key')
minioClient.list_buckets()

我使用WSL2作为开发环境。

Python版本3.7.7, Django版本3.1.2, Minio版本6.0.0

谢谢您的时间。

*编辑:我从我的机器上通过localhost:9000访问minio服务。

解决方法

如果您在 localhost 上工作,它将不会使用 https。 Minio 构造函数的默认实现假定连接是 https。 要使用 http 而不是 https,请将 secure=False 传递给 Minio 构造函数。

minioClient = Minio('minio:9000',access_key='weak_access_key',secret_key='weak_secret_key',secure=False)
minioClient.list_buckets()
,

默认情况下,django minio连接器尝试使用https连接到minio。由于您未在https上运行minio,因此连接器出错,导致它不了解协议。 要解决此问题,只需在djangos settings.py中设置ConvertKeys(有关官方文档,请参见here)。