Reputation:
I am trying to use Docker with Django but I get error - db_1 | error: database is uninitialized and password option is not specified
db_1 | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' (111)")
. When I am using my app without Docker it works. Any suggestions?
My Dockerfile:
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
My docker-compose.yml:
version: '3'
services:
db:
image: mysql
web:
build: .
command: python3 Project/myVirtual/backend/pri/manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
I have changed docker-compose.yaml to:
version: '3'
services:
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: ""
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
web:
build: .
command: python3 virtualPRI/PRI/backend/pri/manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
but at this moment proces has blocked on
db_1 | 2017-06-13T05:16:16.457122Z 0 [Note] End of list of non-natively partitioned tables
or sometimes I still get web_1 | django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' (111)")
manage:py
:
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pri.settings")
try:
from django.core.management import execute_from_command_line
except ImportError:
# The above import may fail for some other reason. Ensure that the
# issue is really that Django is missing to avoid masking other
# exceptions on Python 2.
try:
import django
except ImportError:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
)
raise
execute_from_command_line(sys.argv)
Upvotes: 4
Views: 3975
Reputation: 8241
127.0.0.1 (111)
means MySQL refuses your connect request. I assume MySQL server and Django are not running in the same Docker instance, are they?
If MySQL is running somewhere else, you should make sure you configured the MySQL connection correctly in Django's config file.
Solution 1: You can allow remote access to MySQL (but I don't encourage you do this), by changing the binding address of MySQL from 127.0.0.1
to 0.0.0.0
. and update the MySQL DB connection settings properly.
In Linux you can comment out these lines from /etc/my.cnf
(The location can be different)
skip-networking
bind-address = 127.0.0.1
For more detailed instruction, see also https://dev.mysql.com/doc/refman/5.5/en/can-not-connect-to-server.html
Solution 2: (Inspired by the comment of @programerq) You can run MySQL in host OS or in another Docker instance. As MySQL is bound to 127.0.0.1
by default, you can map MySQLMachine:MySQLPort
to DjangoDocker:MySQLPort
when you start your Django Docker instance. So that Django can still connect to 127.0.0.1
to MySQL without noticing that MySQL is actually running somewhere else.
I did some port mapping in a Docker cluster project before, you can check the commands I ran, or check the official Docker document.
Hope these ideas can be helpful, cheers.
Upvotes: 1