8π
I ran into a similar problem but with another service (not MongoDB). Iβm not sure of what Iβm doing wrong but this is how I could solve it :
import os
import mongoengine
MONGODB_HOST = os.environ.get('DB2_PORT_27017_TCP_ADDR', '127.0.0.1')
mongoengine.connect(host=MONGODB_HOST)
- With
DB2
being the name of your service in docker-compose.yml 27017
being the port of the exposed service.- More about docker-compose environment variables
- Iβd put that in my settings file. But you are free to put it wherever you think itβs appropriate depending on your project architecture
UPDATE
Now docker-compose containers are reachable by other services using a hostname similar to their alias. link documentation :
Containers for the linked service will be reachable at a hostname
identical to the alias, or the service name if no alias was specified.
And that way you can connect to MongoDB like this:
import mongoengine
mongoengine.connect(host="db2")
3π
You should specify host name like in the docker compose file, instead of IP address.
Iβve faced similar problems in connecting from a Tornado Web app to Mongo DB. Here is my docker-compose.yml:
web:
build: .
ports:
- "8888:8888"
volumes:
- .:/code
links:
- db
db:
image: mongo:3.0
Here is my connection string:
motorengine.connect("db", host='db', port=27017, io_loop=io_loop)
My error was to specify IP address instead of host name (db) like in the docker compose file.
2π
I managed to make this connection with the following configuration:
docker-compose.yml
version: "3.9"
services:
mongodb:
environment:
MONGO_INITDB_DATABASE: mydatabase
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: password
hostname: mongodb
image: mongo
ports:
- "27017:27017"
volumes:
- ./data-mongodb:/data/db
api:
build: .
command: "python manage.py runserver 0.0.0.0:8000"
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- mongodb
Dockerfile
# syntax=docker/dockerfile:1
FROM python:3
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
COPY . /code/
requirements.txt
asgiref==3.4.1
Django==3.2.7
django-annoying==0.10.6
djangorestframework==3.12.4
djongo==1.3.6
psycopg2==2.9.1
psycopg2-binary==2.9.1
pymongo==3.12.1
pytz==2021.3
six==1.16.0
sqlparse==0.2.4
settings.py
DATABASES = {
'default': {
'ENGINE': 'djongo',
'NAME': 'mydatabase',
'CLIENT': {
'host': 'mongodb://mongodb:27017',
'username': 'root',
'password': 'password',
'authSource': 'admin',
'authMechanism': 'SCRAM-SHA-1',
}
}
}
In this, the model used is from Djongo instead of from django.db import models
models.py
from djongo import models
After the build, you need to enter the api container and run the ./manage.py migrate
- Django query how to write: WHERE field LIKE '10__8__0__'?
- Django form and i18n
- Django: Forbidden (CSRF cookie not set.)
- How to have Accent-insensitive filter in django with postgres?
- Is it possible to make a mobile app in Django?
1π
The problem you face is that the application container and the DB container start independently from each other and most importantly, the app container wonβt wait until the DB container is started. There is as of docker compose 1.1.0 no feature which would allow to consider such dependencies.
This is a well known problem and has been discussed already. Consensus seems to be that this should not be solved on a docker compose level but in docker itself. There is a proposal already for the groundwork in docker.
In my case, I just built this kind of intelligence in the application itself. I check for port connectivity until successful and then start the rest of the application.
- When are threaded frameworks better than event-driven frameworks? (i.e., when is rails better than node.js?)
- Differentiating between different post requests on the same page in Django views.py
- Using Django Admin Actions to send bulk emails
- How do I use request.META.get('HTTP_REFERER') within template?
1π
I was able to containerize Django and MongoDB, connect both containers.
I used Dockerfiles to build both containers and docker run to start the containers and have them connected. Just follow the steps in this repo. It was necessary for me to use Dockerfiles to have more power over the installed versions of the needed libraries because the latest versions of Django and mongoengine are not compatible.
The stable working versions are
Django==1.10.0
pymongo==2.7.1
six==1.10.0
mongoengine==0.9.0
- Cannot Log in to Django Admin Interface with Heroku Deployed App
- How to go from a Model base to derived class in Django?
- Django python-rq β DatabaseError SSL error: decryption failed or bad record mac