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

uqxowvwt  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(401)

我尝试在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,“未知mysql服务器主机'db'(-2)”)
最有可能的是,带有mysql的容器没有时间启动。但我确实指明了 depends_on: - dbweb 谁知道会发生什么事?

y53ybaqx

y53ybaqx1#

如果我没说错的话你应该用 links 在你的 docker-compose ,作为

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
a64a0gku

a64a0gku2#

depends_on 在docker中,compose意味着一个服务依赖于另一个服务,没有它就不能运行,但这并不意味着另一个服务已经准备好并正在侦听请求。
我喜欢做的是在我的命令中添加一个wait-for命令到需要另一个服务启动并准备好处理请求的容器中。
在你涉及 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 等待主机可用性 db 左舷 3306 从而同步两个相互依赖的服务的启动

dpiehjr4

dpiehjr43#

根据docker的官方文件, depends_on 意味着这个服务依赖于另一个服务,没有它就不能运行,但这并不意味着另一个服务可以处理请求。
因此,在启动部署时,docker compose会确保在启动部署时 web 服务, db 也在跑(如果你想杀死 db 容器,你会注意到docker撰写日志 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关键字的更多信息

相关问题