docker中的Mysql'无法连接到'db \'Django-Restframework上的MySQL服务器 [英] 'Can\'t connect to MySQL server on \'db\' Django-Restframework with Mysql in docker

查看:174
本文介绍了docker中的Mysql'无法连接到'db \'Django-Restframework上的MySQL服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经泊坞化了使用MySQL数据库的现有Django Rest项目.

I have dockerized my existing Django Rest project which uses MySQL database.

文档文件

FROM python:3.6

ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY . /code/
RUN pip install -r requirements.txt

requirements.txt

django
djongo
django-rest-framework
车轮
枕头
mysqlclient
django-cors-headers

django
djongo
django-rest-framework
wheel
pillow
mysqlclient
django-cors-headers

docker-compose.yml

version: '3'
volumes:
    portainer:

services:
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: docker
      MYSQL_DATABASE: docker
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
    ports:
      - "3306:3306"

  web:
    build: .
    command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000 "
    volumes: 
      - .:/code
    ports:
      - "8000:8000"
    links:
     - db
  portainer:
   image: portainer/portainer
   ports:
   - "9000:9000"
   volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - portainer:/data

setting.py

        'ENGINE': 'django.db.backends.mysql', #django.db.backends.mysql 
        'NAME': 'docker', #local: libraries #server: 
        'USER': 'docker', #root #root
        'PASSWORD': 'docker', #local: root #server: 
        'HOST': 'db', #local: localhost  #server:
        'PORT': '3306',

我的命令'docker-compose up -d --build'成功,但是restapp容器未启动,因此在检查日志时显示此错误django.db.utils.OperationalError: (2003, 'Can\'t connect to MySQL server on \'db\' (111 "Connection refused")').

My command 'docker-compose up -d --build' are successful but the restapp container was not started so while checking logs it was showing this error django.db.utils.OperationalError: (2003, 'Can\'t connect to MySQL server on \'db\' (111 "Connection refused")').

推荐答案

如果在完全初始化数据库之前启动了应用程序容器(此处为web),则可能会发生这种情况.

This may happen if your application container (web here) starts before your database is fully initialized.

在启动应用程序(python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000)之前,必须等到db服务启动(更确切地说,直到mysql接受连接).

You must wait until db service is started (more precisely, until mysql is accepting connections) before starting your application (python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000).

为此,您可以使用wait-for-it.sh脚本(检查 https://docs. docker.com/compose/startup-order/),然后再运行python命令.或者,您可以在web服务上使用重启策略( https://docs.docker.com/compose/compose-file/#restart_policy )自动重启服务(直到数据库启动).

For that, you can use wait-for-it.sh script (check https://docs.docker.com/compose/startup-order/) before running your python commands. Alternatively, you could use a restart policy on your web service (https://docs.docker.com/compose/compose-file/#restart_policy) to automatically restart your service (until database is up).

这篇关于docker中的Mysql'无法连接到'db \'Django-Restframework上的MySQL服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆