14

I have two Docker containers. The first one is Postgresql container, which I run using the following command.

sudo docker run -v /home/mpmsp/project/ezdict/postgresql/data:/var/lib/postgresql/data -p 127.0.0.1:5432:5432  -name my-postgres -d postgres

It is based on official image and it is working perfectly, I can connect to Postgresql from the host.

The second container is a container with my Django application. The image is built using the following Dockerfile (based on this image):

FROM python:3-onbuild
EXPOSE 8000 5432
CMD ["/bin/bash"]

And I run this container with the following command

sudo docker run --link my-postgres:my-postgres -v /home/mpmsp/project/ezdict/ezbkend:/usr/src/app -name my-app -i -t my-app

docker ps output shows that containers are linked

NAMES
my-app/my-postgres, my-postgres

However, when I go to localhost:8000, I see an error page from Django, with the following output

OperationalError at /api-auth/login/
could not connect to server: Connection refused
    Is the server running on host "127.0.0.1" and accepting
    TCP/IP connections on port 5432?
Request Method: GET
Request URL:    http://127.0.0.1:8000/api-auth/login/
Django Version: 1.6.4
Exception Type: OperationalError
Exception Value:    
could not connect to server: Connection refused
    Is the server running on host "127.0.0.1" and accepting
    TCP/IP connections on port 5432?
Exception Location: /usr/local/lib/python3.4/site-packages/psycopg2/__init__.py in     connect, line 164
Python Executable:  /usr/local/bin/python
Python Version: 3.4.1
Python Path:    
['/usr/src/app',
 '/usr/local/lib/python34.zip',
 '/usr/local/lib/python3.4',
 '/usr/local/lib/python3.4/plat-linux',
 '/usr/local/lib/python3.4/lib-dynload',
 '/root/.local/lib/python3.4/site-packages',
 '/usr/local/lib/python3.4/site-packages']
Server time:    Птн, 10 Окт 2014 12:07:07 +0400

Application's settings.py

  DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.postgresql_psycopg2',
       'NAME': 'mydb',                      
       'USER': 'postgres',
       'PASSWORD': '',
       'HOST': '127.0.0.1',                      
       'PORT': '5432',                      
    }
  }

How to make linking work? Thanks in advance

2 Answers 2

17

The Dockerfile for your Django image should not expose port 5432 as no Postgresql server will be running in any container created from that image:

FROM python:3-onbuild
EXPOSE 8000
CMD ["/bin/bash"]

Then as you are running the Django container linking it with

--link my-postgres:my-postgres

your settings for the database are incorrect.

In the Django container: 127.0.0.1 refers to the Django container which isn't running any service listening on port 5432.

So your settings.py file should be:

  DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.postgresql_psycopg2',
       'NAME': 'mydb',                      
       'USER': 'postgres',
       'PASSWORD': '',
       'HOST': 'my-postgres',                      
       'PORT': '5432',                      
    }
  }

As you run your Django container with:

sudo docker run --link my-postgres:db -v /home/mpmsp/project/ezdict/ezbkend:/usr/src/app -name my-app -i -t my-app

then your settings.py file would have to be:

  DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.postgresql_psycopg2',
       'NAME': 'mydb',                      
       'USER': 'postgres',
       'PASSWORD': '',
       'HOST': 'db',                      
       'PORT': '5432',                      
    }
  }
Sign up to request clarification or add additional context in comments.

3 Comments

what's about db sync/migration? I realised that I can't link postgres container on build but I need to do syncdb and migrate somehow before run django server.
so the second argument (after the colon) in --link my-postgres:[2nd arg] becomes the value for the HOST key in the default settings regarding django's DATABASES?
yes, the syntax is --link <a container name>:<alias>
0

Ths syncdb only works AFTER both db and django containers are build and started, then you can manually run the syncdb command with fig/docker-compose/docker. I am thinking of creating an AT job and let the container run the syncdb itself (and creating an admin user after the syncdb - for creating the necessary tables)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.