django.db.utils.OperationalError:(2005,“未知的 MySQL 服务器主机 'db' (-2)”)

2024-02-18

我正在尝试在 docker 容器中运行 django 和 mysql:

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,“未知的 MySQL 服务器主机 'db' (-2)")

最有可能的是,带有 mysql 的容器没有时间启动。但我确实指定了depends_on: - db in theweb

谁知道可能出了什么问题?


根据 docker-compose 官方文档 https://docs.docker.com/compose/compose-file/compose-file-v2/#depends_on, 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 关键字的更多信息 https://docs.docker.com/compose/compose-file/compose-file-v2/#restart

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

django.db.utils.OperationalError:(2005,“未知的 MySQL 服务器主机 'db' (-2)”) 的相关文章

随机推荐