django.db.utils.OperationalError: (2005, "Unknown MySQL server host 'db' (-2)")
Posted
技术标签:
【中文标题】django.db.utils.OperationalError: (2005, "Unknown MySQL server host \'db\' (-2)")【英文标题】:django.db.utils.OperationalError: (2005, "Unknown MySQL server host 'db' (-2)")django.db.utils.OperationalError: (2005, "Unknown MySQL server host 'db' (-2)") 【发布时间】:2019-02-01 03:11:19 【问题描述】:我正在尝试在 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的容器没有时间启动。但是我确实在web
中指定了depends_on: - db
谁知道可能是什么问题?
【问题讨论】:
db 服务是否正常启动?容器是否正在运行 嘿@Narnik 你找到解决这个问题的方法了吗?我面临同样的问题 【参考方案1】:在我的情况下,我没有准备好连接到外部网络的 *** 连接。我不知道 Linux 下的“网络设置”会在每次计算机重启后将 *** 连接切换到 off
。
然后我得到了类似的错误:
$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中,我猜这些只是连接对象的参数中的位置。在我的情况下,与 db 的连接是不可能的,我再次在容器的 bash 中对其进行了测试,在命令行上使用 mysql。
解决方法:再次打开***,就可以建立连接了:
如果上述方法没有帮助,您还可以检查您的端口 3306 是否已被另一个容器使用 (docker ps -a
)。如果是这样,请尝试 ports: -"3307:3306" 或其他端口。这只是我在它运行之前所做的一个步骤,尽管我认为它与所讨论的错误无关。我仍然不能确定这是否也没有解决问题。
【讨论】:
【参考方案2】:就我而言(降级),我在 Compose 文件的 volumes
部分声明了一些悬空的命名卷,并将匿名卷附加到容器上。
执行中
docker-compose down -v
解决了这个问题。请注意,这实际上会删除在 volumes
中声明的命名卷。
【讨论】:
【参考方案3】: docker-compose 中的depends_on
表示一个服务依赖于另一个服务,没有它就无法运行,但这并不意味着另一个服务已准备好并正在监听请求。
我喜欢在我的命令中添加一个wait-for-it 到需要另一个服务启动并准备好处理请求的容器。
在您涉及db
和web
的情况下,在我的代码目录中放入wait-for-it.sh 后,我会将Web 容器的命令修改为:
./wait-for-it.sh -t 300 db:3306 && python manage.py runserver 0.0.0.0:8000
这将简单地告诉web
在端口3306
上等待主机db
的可用性,从而同步两个相互依赖的服务的启动
【讨论】:
感谢wait-for-it.sh
,但我遇到了同样的错误。
尝试先运行docker-compose up db
,然后远程登录到它的主机和端口,看看数据库是否正常运行【参考方案4】:
According to the official docker-compose documentation, 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
You can find more about the restart keyword in the official documentation
【讨论】:
感谢您的回复,但restart: always
无法解决我的问题。
mysql版本有约束吗?您可以改用mysql:5.7
重试吗(在此之前清理您的./db
文件夹,否则您最终会出现意外行为)?请记住,数据库初始化需要一些时间(这实际上取决于您正在运行的硬件)。通常,您应该等待 20-30 秒,然后 mysql 才可用。以上是关于django.db.utils.OperationalError: (2005, "Unknown MySQL server host 'db' (-2)")的主要内容,如果未能解决你的问题,请参考以下文章