Linking Django and Postgresql with Docker - python

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

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',
}
}

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)

Related

mysql.connector.errors.DatabaseError: 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

I am creating a docker file that contains a flask app and mysql. This should run on localhost for now.
The flask app is running and so as the mysql server. I am able to connect to mysql server. The app is not able to connect to db.
Python code connecting
def establish_connection():
config = {
'user': 'root',
'password': 'root',
'host': '127.0.0.1',
'port': '3306',
'database': 'persist'
}
cnx: str = mysql.connector.connect(**config)
print(cnx)
return cnx
Dockerfile
FROM python:3.7.4-buster
WORKDIR /stocksite
ENV FLASK_APP main.py
ENV FLASK_RUN_HOST 0.0.0.0
EXPOSE 5000 32000 3306
COPY . .
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
db:
image: mysql
container_name: db
ports:
- "32000:3306"
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./data/db:/docker-entrypoint-initdb.d
I receive the below error:
mysql.connector.errors.DatabaseError: 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)
Docker compose services are available to other services using their name. Your db service can be connected to from your web container using db:3306
config = {
'user': 'root',
'password': 'root',
'host': 'db',
'port': '3306',
'database': 'persist'
}
In the docker-compose you map the port 3306 of the db inside the container to the port 32000 on the host machine.
In the app you should use port 32000 not 3306.
def establish_connection():
config = {
'user': 'root',
'password': 'root',
'host': '127.0.0.1',
'port': '32000',
'database': 'persist'
}
cnx: str = mysql.connector.connect(**config)
print(cnx)
return cnx

Can't connect to MySQL while building docker-compose image

I have a configuration of docker-compose, and on building database step, django management throws an error:
django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on '127.0.0.1' (115)")
I think - the docker refusing connections.
Configuration by socket similar not working (Says error connection by socket)
Docker Compose file
version: '3'
services:
db:
image: mariadb:5.5
restart: always
environment:
MYSQL_ROOT_PASSWORD: "root"
MYSQL_DATABASE: "bh"
MYSQL_USER: "root"
MYSQL_PASSWORD: "root"
ports:
- "3302:3306"
behealthy_dev:
build: .
container_name: behealthy_dev
expose:
- "86"
command: python manage.py runserver 0.0.0.0:80
volumes:
- /behealthy_dev/
ports:
- "86:86"
depends_on:
- db
Dockerfile
FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /behealthy_dev
WORKDIR /behealthy_dev
ADD requirements.txt /behealthy_dev/
RUN pip install -r requirements.txt
ADD . /behealthy_dev/
RUN python manage.py makemigrations
RUN python manage.py migrate
RUN python manage.py collectstatic --noinput
Database settings (settings)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'bh',
'HOST': '127.0.0.1',
'PORT': '3306',
'USER': 'root',
'PASSWORD': 'root',
'OPTIONS': {
'sql_mode': 'traditional',
'init_command': 'SET innodb_strict_mode=1',
'charset': 'utf8mb4',
},
},
}
Have any solutions? I tried to resolve from other stack answer but it's not working for me.
in your service behealthy_dev change the MySQL host from
'HOST': '127.0.0.1'
to
'HOST': 'db',
Edit:
Change also the MYSQL_ROOT_PASSWORD: "root" to:
`MYSQL_ROOT_PASSWORD: "rootpassword"`
and your Database settings to:
'PASSWORD': 'rootpassword',

Wrong configuration for database in seetings.py or docker

I'm learning how to work with Compose + Django using this manual https://docs.docker.com/compose/django/
Here are my configuration files
docker-compose.yml
version: '3'
services:
db:
image: postgres
web:
build: .
command: python3 manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
setting.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}
When I run using docker-compose up everything is fine.
But when I run using python manage.py runserver I got this error
psycopg2.OperationalError: could not translate host name "db" to address: Name or service not known
Guess, I have wrong cofiguration
You forgot set hostname in db service.
version: '3'
services:
db:
image: postgres
hostname: db
web:
build: .
command: python3 manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
Tip: Don't use runserver when you deploy production server. Check this doc
The solution is described in comments
Edit)
separate settings example. Make your original settings.py to base.py in settings folder.
<your_app>/settings/local.py
from .base import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'HOST': 'localhost',
'PORT': 5432,
}
}
<your_app>/settings/deploy.py
from .base import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}
So finally, your settings folder contains three python file. base.py, local.py, deploy.py
And when you run server with local settings, python manage.py runserver --settings <your_app>.settings.local.
This is a common problem in docker/django setup , postgres container is initialized but the engine is not ready yet.
You must wait for the postgresql server to start before running the web container.
You can do this in several ways , have a look at dockerize
dockerize -timeout=20s -wait ${POSTGRES_PORT}
I guess you trying to run manage.py runserver on host machine. Error means, that you have no access to host 'db' from it (try ping db in console). There are several causes of this:
Your docker container db is down. Try run docker-compose up -d db
You are using Windows as host system. In Windows there is no access to containers from host, you must install postgres locally.
You have networking problems. Try ping 127.0.0.11 (it's docker's DNS server)
P.S. Do you really want local Django use Postgres in container?

Django heroku connection refused

Deployment of my site to heroku seems to be working, until I try to use my login feature then it throws an error:
OperationalError at /login/ could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 5432?
This error seems to occur during template rendering of a form (captcha).
my procfile:
web: waitress-serve --port=$PORT capstonenotespool.wsgi:application
settings.py:
import dj_database_url
DATABASES = { 'default': dj_database_url.config() }
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'capstonenotespool',
'USER': 'postgres',
'PASSWORD': '****',
'HOST': 'localhost',
'PORT': '',
}
}
I've tried changing $PORT in the procile to 5432, but this does not work. I've also tried manually setting the PORT in settings to 5432 but this also doesn't work.
I also noted that Django error logs produces these variables:
SERVER_NAME 'localhost'
SERVER_PORT '23994'
SERVER_PROTOCOL 'HTTP/1.1'
SERVER_SOFTWARE 'waitress'
Removing the localhost from HOST in settings gives the following error:
could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

django Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock

I have made a virtual environment and installed following:
sudo apt-get install libmysqlclient-dev
sudo pip install MySQL-python
and my setting is :
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DB_NAME',
'USER': 'DB_USER',
'PASSWORD': 'DB_PASSWORD',
'HOST': 'localhost',
'PORT': '3306',
}
}
and when I do manage.py syncdb it gives the error saying 2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")
I dont know whats wrong in here...
I searched for it... Mostly I found if I use virtualenvironment then the above setting is enough... Whats wrong in here ???
Install mysql server
sudo apt-get install mysql-server
then create a database for your purposes:
mysql -u root -p --execute "create database DB_NAME; grant all on DB_NAME.* to DB_USER#localhost identified by 'DB_PASSWORD';"
then you should be fine.
I should point out that the confusion of mysql searching for a socket, even if specifying a port, is because mysql defaults to a socket when specifying localhost as an address, if you want to use tcp/ip then you should put an address like 127.0.0.1 there.
Your HOST should change to '127.0.0.1', you must start service, especially if you are using xamp or lamp.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DB_NAME',
'USER': 'DB_USER',
'PASSWORD': 'DB_PASSWORD',
'HOST': '127.0.0.1',
'PORT': '3306',
} #Your HOST should change to '127.0.0.1', you must start service, especially if you are using xamp or lamp

Categories

Resources