![](/img/trans.png)
[英]What is django.db.utils.OperationalError: (2000, 'Unknown MySQL error')
[英]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
depends_on
-compose中的depends_on
表示服務依賴於另一個服務,沒有它就無法運行,但這並不意味着另一個服務已准備就緒且正在偵聽請求。
我想做的是在命令中添加一個wait-for-it到需要其他服務並准備好處理請求的容器中。
在涉及db
和web
的情況下,在我的代碼目錄中放入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.