15

This has already been asked, but none of the answers have helped me. This is my configuration. Im running docker-compose with two services, a web app in django and the database in mariadb. I can connect normally to my local db with this exact configuration, only changing the host in settings.py to localhost. When i run docker-compose up, the web service stops immediately after trying to connect to the database, and return this error.

django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")

Dockerfile

FROM python:3.7

RUN mkdir /app

COPY requierments.txt /app/

WORKDIR /app

RUN pip install -r requierments.txt

COPY . /app/

docker-compose.yml

version: '3'

services:
  db:
    image: mariadb:10.2
    expose:
      - 3306
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: 'django_backend'
      MYSQL_USER: 'django'
      MYSQL_PORT: '3306'
      MYSQL_PASSWORD: 'mysql1234pass'
      MYSQL_ROOT_PASSWORD: 'password'

  web:
    build: .
    image: backendblockchain_web
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - db
    links:
      - db
    command:
      - /bin/bash
      - -c
      - |
        sleep 10
        python3 manage.py migrate
        python3 manage.py runserver 0.0.0.0:8000

setting.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_backend',
        'USER': 'django',
        'PASSWORD': 'mysql1234pass',
        'HOST': 'db',
        'PORT': '3306'
    }
}
  • Run `docker ps` to see the container name of the DB and use it as the database host for Django. – Klaus D. Oct 24 '19 at 18:24
  • 1
    With the name of the service is not enough? The name of the container changes everytime i do docker-compuse up, unless I specify one. – Joel David Hernández Cruz Oct 24 '19 at 18:34
  • It should stay the same, something like `folder_db_1` but you can also set a static host name in the YAML. The service name is not part of the DNS resolution. – Klaus D. Oct 24 '19 at 18:37

3 Answers3

13

your WEB containers starts before the DB is up and running , you need to wait for it using one of these methods or starting your DB first manually with docker-compose up db

LinPy
  • 16,987
  • 4
  • 43
  • 57
  • Thanks, that was the problem, I thought that, and added the `sleep 10` when starting the web service but that still fails. Waiting for `ready for connections` from the db service to make the migrations was the solution. Thanks – Joel David Hernández Cruz Oct 25 '19 at 14:49
  • Can you please help, I have used docker-compose.yml file as yours but getting same error. How did you added "Ready for connection" in docker-compose. Please help. Thank you – sachin gera Mar 18 '21 at 09:25
3

Make sure that your db docker image is running fine. Check the logs of the running db container. I am able to use MariaDB successfully in my docker-compose file :

db:
image: mariadb
ports:
  - 3306:3306
environment:
  MYSQL_USER: "****"
  MYSQL_PASSWORD: "****"
  MYSQL_DATABASE: "*****"
  MYSQL_RANDOM_ROOT_PASSWORD: "yes"
iabughosh
  • 481
  • 5
  • 19
0

A bit late for the party but if you are connecting to port 33060 change to port 3306.

Took a whole hour to recognize it exposes two ports.

phacic
  • 1,402
  • 1
  • 14
  • 21