4

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) 
9
  • provide docker command/docker compose file Commented Jun 13, 2017 at 4:52
  • @AzatIbrakov I have updated my post. Commented Jun 13, 2017 at 4:58
  • try to force remove containers/images and try again Commented Jun 13, 2017 at 6:15
  • You mean to delete Dockerfile, docker-compose.yml and generate them one more time? I have tried docker rm $(docker ps -aq --filter name=mysql) but still the same Commented Jun 13, 2017 at 6:20
  • i've tried your docker-compose.yml without web service, works fine Commented Jun 13, 2017 at 6:48

1 Answer 1

1

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.

Sign up to request clarification or add additional context in comments.

4 Comments

I'm working on mac os and I have found my.cnf but there is no information about bind-address = 127.0.0.1 only commented #skip-networking.
Because the mysql server is running in one container, and the code producing the Can't connect to MySQL server on '127.0.0.1' (111) error message is in another container, this is an expected error message. Each container gets its own 127.0.0.1 since it gets its own network namespace. The mysql docker image is configured to listen on all container interfaces, and the code in the other container can contact it via network service discovery. The my.cnf file does not need to be changed.
@programmerq well, you can expose particular a local port via Docker network interface. That is a good idea.
@stanleyxu2005 How do we configure the same for the docker-compose file. Facing the same error with MySQL and Ubuntu docker instances running separately.