簡體   English   中英

django.db.utils.OperationalError: (2005, "Unknown MySQL server host 'db' (-2)")

[英]django.db.utils.OperationalError: (2005, "Unknown MySQL server host 'db' (-2)")

我正在嘗試在 docker 容器中使用 mysql 運行 django:

version: '2'
services:

  db:
    image: mysql:latest
    volumes:
      - ./db:/var/lib/mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: mypassword
      MYSQL_USER: root
      MYSQL_PASSWORD: mypassword
      MYSQL_DATABASE: django
    expose:
      - "3306"

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
     - db

但是在docker-compose up --build之后我得到了錯誤:

django.db.utils.OperationalError: (2005, "Unknown MySQL server host 'db' (-2)")

很可能,帶有 mysql 的容器沒有時間啟動。 但我確實指定depends_on: - db web中的db

誰知道可能是什么問題?

根據 depends_on -compose官方文檔depends_on表示該服務依賴於另一個服務,沒有該服務就無法運行,但這並不意味着另一個服務已准備好處理請求。

因此,在啟動部署時,docker-compose會確保在啟動web服務時, db也正在運行(如果嘗試db容器,您會在docker compose日志中注意到web將終止)。 由於MySQL映像需要一些時間才能首次啟動,因此這導致數據庫無法立即處理查詢。

為了解決此問題,docker-compose具有關鍵字restart ,用於在出現問題且進程終止時(例如,沒有准備好處理請求的db )指定容器的行為。

最后,您docker-compose.yaml文件應為:

version: '2'
services:

  db:
    image: mysql:latest
    volumes:
      - ./db:/var/lib/mysql
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: mypassword
      MYSQL_USER: root
      MYSQL_PASSWORD: mypassword
      MYSQL_DATABASE: django
    expose:
      - "3306"

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    restart: always
    ports:
      - "8000:8000"
    depends_on:
     - db

您可以在官方文檔中找到有關restart關鍵字的更多信息。

depends_on -compose中的depends_on表示服務依賴於另一個服務,沒有它就無法運行,但這並不意味着另一個服務已准備就緒且正在偵聽請求。

我想做的是在命令中添加一個wait-for-it到需要其他服務並准備好處理請求的容器中。

在涉及dbweb的情況下,在我的代碼目錄中放入wait-it.sh之后,我將對Web容器的命令修改為:

./wait-for-it.sh -t 300 db:3306 && python manage.py runserver 0.0.0.0:8000

這只會告訴web等待端口3306上的主機db的可用性,從而同步兩個相互依賴的服務的啟動

如果我沒看錯,則應在docker-compose使用links ,如下所示

version: '2'
services:

  db:
    image: mysql:latest
    volumes:
      - ./db:/var/lib/mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: mypassword
      MYSQL_USER: root
      MYSQL_PASSWORD: mypassword
      MYSQL_DATABASE: django
    expose:
      - "3306"

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
     - db
    links: - db

就我而言(降級),我在 Compose 文件的volumes部分聲明了一些懸空的命名卷,並將匿名卷附加到容器。 執行

docker-compose down -v

解決了這個問題。 請注意,這實際上會刪除在 volumes 中聲明的命名volumes

就我而言,我沒有准備好連接外部網絡的 VPN 連接。 我不知道 Linux 下的“網絡設置”會在每次計算機重新啟動后off VPN 連接。

然后我得到了這個類似的錯誤:

$docker-compose up
Recreating MYCONTAINER ... done
Attaching to MYCONTAINER
MYDOCKERCOMPOSESERVICE_1  | 2022-01-14 10:56:30,045 [INFO]: Connecting to DB ...
MYDOCKERCOMPOSESERVICE_1  | Traceback (most recent call last):
MYDOCKERCOMPOSESERVICE_1  |   File "/usr/lib/python3.9/runpy.py", line 197, in _run_module_as_main
MYDOCKERCOMPOSESERVICE_1  |     return _run_code(code, main_globals, None,
MYDOCKERCOMPOSESERVICE_1  |   File "/usr/lib/python3.9/runpy.py", line 87, in _run_code
MYDOCKERCOMPOSESERVICE_1  |     exec(code, run_globals)
MYDOCKERCOMPOSESERVICE_1  |   File "/MYDOCKERCOMPOSESERVICE/main.py", line 265, in <module>
MYDOCKERCOMPOSESERVICE_1  |     main()
MYDOCKERCOMPOSESERVICE_1  |   File "/MYDOCKERCOMPOSESERVICE/main.py", line 244, in main
MYDOCKERCOMPOSESERVICE_1  |     MYSERVER_conn = create_connection(MYSERVER_CONNECTION)
MYDOCKERCOMPOSESERVICE_1  |   File "/MYDOCKERCOMPOSESERVICE/main.py", line 65, in create_connection
MYDOCKERCOMPOSESERVICE_1  |     conn = MySQLdb.connect(cursorclass=cursors.DictCursor, charset="utf8",
MYDOCKERCOMPOSESERVICE_1  |   File "/usr/local/lib/python3.9/dist-packages/MySQLdb/__init__.py", line 123, in Connect
MYDOCKERCOMPOSESERVICE_1  |     return Connection(*args, **kwargs)
MYDOCKERCOMPOSESERVICE_1  |   File "/usr/local/lib/python3.9/dist-packages/MySQLdb/connections.py", line 185, in __init__
MYDOCKERCOMPOSESERVICE_1  |     super().__init__(*args, **kwargs2)
MYDOCKERCOMPOSESERVICE_1  | MySQLdb._exceptions.OperationalError: (2005, "Unknown MySQL server host 'MYSERVER' (-3)")
MYDOCKERCOMPOSESERVICE_1  | (2005, "Unknown MySQL server host 'MYSERVER' (-3)")
MYCONTAINER exited with code 1

這里-3,在問題-2中,我猜這些只是連接對象的參數中的位置。 在我的情況下,與數據庫的連接是不可能的,我再次在容器的 bash 中測試它,在命令行上使用 mysql。

解決方案:再次打開VPN,即可建立連接:

在此處輸入圖像描述

暫無
暫無

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

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