1

I am unable to connect to the containerized instance of mongodb via flask app.

Here's my docker-compose.yml file:

version: '3.7'

services:
  db:
    image: mysql:8.0.27
    command: '--default-authentication-plugin=mysql_native_password'
    restart: always
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
      interval: 3s
      retries: 5
      start_period: 30s
    secrets:
      - db-password
    volumes:
      - ./db/backup:/docker-entrypoint-initdb.d/:ro
    networks:
      - backnet
    environment:
      - MYSQL_DATABASE=pythonlogin_advanced
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db-password
    expose:
      - 3306
      - 33060

  mongodb:
    image: mongo:latest
    container_name: mongodb
    restart: unless-stopped
    environment:
      - MONGO_INITDB_DATABASE=dstudiox
    volumes:
      - db-data:/data/db
    ports:
      - "27017"
    

  app:
    build: .
    image: dstudiopro
    restart: unless-stopped
    secrets:
      - db-password
    ports:
      - 5000:5000
    volumes:
      - .:/app
    networks:
      - backnet
    depends_on:
      - db
      - mongodb
  


volumes:
  db-data:
secrets:
  db-password:
    file: db/password.txt
networks:
  backnet:

...and a snippet of the main.py file (the actual one is huge)

from flask import Flask, render_template, request, redirect, url_for, session, make_response
from flask_mysqldb import MySQL
from flask_mail import Mail, Message
import MySQLdb.cursors, re, uuid, hashlib, datetime, os, math, urllib, json
from importlib_metadata import metadata
from engine import training
import csv
import pickle
import pandas as pd
from gridfs import GridFS
from flask import Flask, render_template, url_for, request, session, redirect
import os
from flask_pymongo import PyMongo
import bcrypt
from bson import ObjectId
import re
import nltk


app = Flask(__name__)
app.secret_key = 'your secret key'
app.config['threaded'] = True
# app.config['MONGO_URI'] = 'mongodb://0.0.0.0:27017/dstudiox'
app.config['MONGO_URI'] = 'mongodb://mongodb:27017/dstudiox'

mongo = PyMongo(app)
model_fs = GridFS(mongo.db, collection='models')
vec_fs = GridFS(mongo.db, collection='vectorizer')
enc_fs = GridFS(mongo.db, collection='encoder')
admin_fs = GridFS(mongo.db, collection='admin')


app.config['MYSQL_HOST'] = 'db'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'password'
app.config['MYSQL_DB'] = 'pythonlog'

...and this is the error I get; I did try various versions of pymongo but didn't work. Interestingly, when I connect the dockerized instance of mongodb server from another Flask application (not dockerized), it works fine!

pymongo.errors.ServerSelectionTimeoutError: mongodb:27017: [Errno -3] Temporary failure in name resolution, Timeout: 30s, Topology Description: <TopologyDescription id: 62cdad14854209282c69dc83, topology_type: Unknown, servers: [<ServerDescription ('mongodb', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('mongodb:27017: [Errno -3] Temporary failure in name resolution')>]>

docker ps -a returns all containers showing up and running, including mongodb.

CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                    PORTS                      NAMES
30506f105027   dstudiopro     "/bin/sh -c 'flask r…"   44 minutes ago   Up 44 minutes             0.0.0.0:5000->5000/tcp     dstudio_app_1
e8a2d8f390ac   mysql:8.0.27   "docker-entrypoint.s…"   44 minutes ago   Up 44 minutes (healthy)   3306/tcp, 33060/tcp        dstudio_db_1
81919717bf27   mongo:latest   "docker-entrypoint.s…"   44 minutes ago   Up 44 minutes             0.0.0.0:56367->27017/tcp   mongodb

1 Answer 1

1

The two containers aren't on the same networks:, so they can't connect to each other. The app container is only on the backnet network, but the mongodb container doesn't have a networks: block so it is on a default network.

Compose provides a network named default for you, so the easiest way to address this issue is simply to remove all of the networks: blocks in the entire file. Networking in Compose in the Docker documentation has further description of this setup.

version: '3.8'
services:
  mongodb:
    image: mongo:latest
    restart: unless-stopped
    environment:
      - MONGO_INITDB_DATABASE=dstudiox
    volumes:
      - db-data:/data/db
    ports:
      - "27017"

  app:
    build: .
    restart: unless-stopped
    secrets:
      - db-password
    ports:
      - 5000:5000
    depends_on:
      - mongodb
    # no networks:

# no networks: at top level either
Sign up to request clarification or add additional context in comments.

1 Comment

This absolutely works! Thank you. I went ahead and added the same "backnet" networks block to both the containers.

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.