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 到需要另一个服务启动并准备好处理请求的容器。

在您涉及dbweb 的情况下,在我的代码目录中放入wait-for-it.sh 后,我会将Web 容器的命令修改为:

./wait-for-it.sh -t 300 db:3306 &amp;&amp; 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)")的主要内容,如果未能解决你的问题,请参考以下文章