簡體   English   中英

在 Docker 上運行的 Django 中的密碼學錯誤

[英]Cryptography error in Django run on Docker

我正在嘗試部署一個具有在 Django 中開發的后端的網站。 我設置了兩個 Docker 容器,其中包含一個 Django 實例和一個 MySQL 實例。 我還在容器之間設置了一個網絡以創建通信。 問題是,當我使用參數 MYSQL_ROOT_PASSWORD 啟動 MySQL 容器時,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 端口是否在我的 PC 上可用,是的。 另一方面,如果我用 MYSQL_ALLOW_EMPTY_PASSWORD 啟動 MySQL 容器,並在 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:

我已經被這個錯誤困擾了好幾天了。

先感謝您。

我自己解決了這個問題。 我已經打開了關於這個的各種 stackOverflow 主題,但什么也沒有。 我搜索了“pip install cryptography”,問題就在這里。 因此,在模擬 Alpine 環境的 Docker 中,解決方案是將這些代碼行添加到您的 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

而且……它運行。

您可以通過安裝此依賴項來解決它:

  1. $ pip install django-cryptographic-fields

  2. 添加然后將“cryptographic_fields”添加到您的 INSTALLED_APPS 設置中,如下所示:

INSTALLED_APPS = (
...
'cryptographic_fields',
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM