问题
I have dockerized my existing Django Rest project which uses MySQL database.
Dockefile
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
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',
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")')
.
回答1:
This may happen if your application container (web
here) starts before your database is fully initialized.
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
).
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).
来源:https://stackoverflow.com/questions/53129271/can-t-connect-to-mysql-server-on-db-django-restframework-with-mysql-in-doc