Ошибка криптографии в Django, запущенном на Docker - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь развернуть веб-сайт с бэкэндом, разработанным в Django.Я установил два контейнера Docker, которые содержат экземпляр Django и экземпляр MySQL.Я также установил сеть между контейнерами, чтобы создать связь.Проблема в том, что когда я запускаю контейнер MySQL с параметром MYSQL_ROOT_PASSWORD, Django выдает мне следующую ошибку:

return Database.connect(**conn_params)
app    |   File "/usr/local/lib/python3.7/site-packages/pymysql/__init__.py", line 94, in Connect
app    |     return Connection(*args, **kwargs)
app    |   File "/usr/local/lib/python3.7/site-packages/pymysql/connections.py", line 325, in __init__
app    |     self.connect()
app    |   File "/usr/local/lib/python3.7/site-packages/pymysql/connections.py", line 599, in connect
app    |     self._request_authentication()
app    |   File "/usr/local/lib/python3.7/site-packages/pymysql/connections.py", line 882, in _request_authentication
app    |     auth_packet = _auth.caching_sha2_password_auth(self, auth_packet)
app    |   File "/usr/local/lib/python3.7/site-packages/pymysql/_auth.py", line 264, in caching_sha2_password_auth
app    |     data = sha2_rsa_encrypt(conn.password, conn.salt, conn.server_public_key)
app    |   File "/usr/local/lib/python3.7/site-packages/pymysql/_auth.py", line 142, in sha2_rsa_encrypt
app    |     raise RuntimeError("cryptography is required for sha256_password or caching_sha2_password")
app    | RuntimeError: cryptography is required for sha256_password or caching_sha2_password

Я проверил, что порт 3306 доступен на моем ПК, и да, это так.С другой стороны, если я запускаю контейнер MySQL с MYSQL_ALLOW_EMPTY_PASSWORD и устанавливаю пустой пароль в settings.py, он работает.

Здесь есть мой settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbname',
        'USER': 'username',
        'PASSWORD': 'userpwd',
        'HOST': 'db',
        'PORT': '3306'
    }
}

Вместо этого,это мой файл docker-compose.yml

version: "3"
services:
  app:
    build:
      context: .
    container_name: app
    ports:
      - "8000:8000"
    networks:
      - backend_split
    depends_on:
      - db
    restart: always
    volumes:
      - ./app:/app
    command:
      sh -c "python manage.py runserver 0.0.0.0:8000"
  db:
    image: mysql
    container_name: db
    expose:
      - "3306"
    networks:
      - backend_split
    environment:
      - MYSQL_ROOT_PASSWORD=rootpwd
      - MYSQL_DATABASE=databasename
      - MYSQL_USER=username
      - MYSQL_PASSWORD=userpwd

networks:
  backend_split:

Я застрял с этой ошибкой в ​​течение нескольких дней.

Заранее спасибо.

1 Ответ

0 голосов
/ 27 февраля 2019

Я решил эту проблему самостоятельно.Я открыл все виды стековых тем об этом, но ничего.Я искал "pip install cryptography", и хитрость была здесь.Итак, в Docker, который эмулирует среду Alpine, решение состоит в том, чтобы добавить следующие строки кода в ваш Dockerfile:

RUN apk add gcc
RUN apk add --no-cache libressl-dev musl-dev libffi-dev
RUN pip install --no-cache-dir cryptography==2.1.4
RUN apk del libressl-dev \
        musl-dev \
        libffi-dev

И ... он запускается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...