Docker-создает с помощью Django, MongoDB, используя ОШИБКУ Djongo — pymongo.errors.Ошибка ServerSelectionTimeoutError

#django #mongodb #docker #docker-compose #djongo

#django #mongodb #docker #docker-compose #djongo

Вопрос:

Я хочу запустить приложение django, используя djongo с mongo и docker. Моя настройка выглядит так:

docker-compose.yml

 version: '3.7'

services: 
    webserver:
        build: 
            context: .
        ports:
            - "8000:8000"
        volumes: 
            - ./webserver:/webserver
        command: sh -c "python manage.py runserver 0.0.0.0:8000"
        environment: 
            - DEBUG=1
        links:
            - mongo
        depends_on: 
            - migration
    
    mongo:
        image: mongo:latest
        restart: unless-stopped 
        volumes: 
            - ./mongo/data/db:/data/db
        environment: 
            MONGO_INITDB_ROOT_USERNAME: root
            MONGO_INITDB_ROOT_PASSWORD: mongoadmin
            MONGO_INITDB_DATABASE: raspicam
        ports: 
            - "27017:27017"
 
            
    migration:
        build: .
        image: app
        command: sh -c "python manage.py migrate"
        volumes:
            - ./webserver:/webserver
        links:
            - mongo
        depends_on:
            - make_migrations
    
    make_migrations:
        build: .
        image: app
        command: sh -c "python manage.py makemigrations"
        volumes:
            - ./webserver:/webserver
        links:
            - mongo
        depends_on:
            - mongo
  

Dockerfile:

 FROM python:3.8-alpine

ENV PATH="/scripts:${PATH}"
ENV LIBRARY_PATH=/lib:/usr/lib

COPY ./requirements.txt /requirements.txt
RUN apk add --update --no-cache --virtual .tmp gcc libc-dev linux-headers jpeg-dev libjpeg-turbo
RUN apk add build-base python3-dev zlib-dev
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r /requirements.txt
RUN apk add libjpeg
RUN apk del .tmp

RUN mkdir /webserver
COPY ./webserver /webserver
WORKDIR /webserver
COPY ./scripts /scripts

RUN chmod  x /scripts/*

RUN mkdir -p /vol/web/media
RUN mkdir -p /vol/web/

RUN adduser -D user
RUN chown -R user:user /vol
RUN chmod -R 755 /vol/web
USER user

CMD ["entrypoint.sh"]
  

settings.py

 DATABASES = {
    "default": {
        "ENGINE": "djongo",
        "NAME": "raspicam",
        "CLIENT": {
            "host": "mongodb://mongodb:27017",
            "username": "root",
            "password": "mongoadmin",
            "authSource": "admin",
            "authMechanism": "SCRAM-SHA-1",
        },
    }
}
  

Я уже тестирую на своем локальном компьютере, и это работает.
но я пытаюсь настроить его. Проблема в том, что когда я «docker-compose up», я получаю следующую ошибку.

 Creating server_mongo_1 ... done
Creating server_make_migrations_1 ... done
Creating server_migration_1       ... done
Creating server_webserver_1       ... done
mongo_1            | Successfully added user: {
mongo_1            |    "user" : "root",
mongo_1            |    "roles" : [
mongo_1            |            {
mongo_1            |                    "role" : "root",
mongo_1            |                    "db" : "admin"
mongo_1            |            }
mongo_1            |    ]
mongo_1            | }
mongo_1            | Error saving history file: FileOpenFailed Unable to open() file /home/mongodb/.dbshell: No such file or directory
make_migrations_1  | Traceback (most recent call last):
make_migrations_1  |   File "manage.py", line 21, in <module>
make_migrations_1  |     main()
make_migrations_1  |   File "manage.py", line 17, in main
make_migrations_1  |     execute_from_command_line(sys.argv)
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
make_migrations_1  |     utility.execute()
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 375, in execute
make_migrations_1  |     self.fetch_command(subcommand).run_from_argv(self.argv)
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 323, in run_from_argv
make_migrations_1  |     self.execute(*args, **cmd_options)
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 364, in execute
make_migrations_1  |     output = self.handle(*args, **options)
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 83, in wrapped
make_migrations_1  |     res = handle_func(*args, **kwargs)
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/makemigrations.py", line 101, in handle
make_migrations_1  |     loader.check_consistent_history(connection)
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 283, in check_consistent_history
make_migrations_1  |     applied = recorder.applied_migrations()
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 73, in applied_migrations
make_migrations_1  |     if self.has_table():
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 56, in has_table
make_migrations_1  |     return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/introspection.py", line 48, in table_names
make_migrations_1  |     return get_names(cursor)
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/introspection.py", line 43, in get_names
make_migrations_1  |     return sorted(ti.name for ti in self.get_table_list(cursor)
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/djongo/introspection.py", line 47, in get_table_list
make_migrations_1  |     for c in cursor.db_conn.list_collection_names()
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/pymongo/database.py", line 863, in list_collection_names
make_migrations_1  |     for result in self.list_collections(session=session, **kwargs)]
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/pymongo/database.py", line 825, in list_collections
make_migrations_1  |     return self.__client._retryable_read(
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1460, in _retryable_read
make_migrations_1  |     server = self._select_server(
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1278, in _select_server
make_migrations_1  |     server = topology.select_server(server_selector)
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/pymongo/topology.py", line 241, in select_server
make_migrations_1  |     return random.choice(self.select_servers(selector,
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/pymongo/topology.py", line 199, in select_servers
make_migrations_1  |     server_descriptions = self._select_servers_loop(
make_migrations_1  |   File "/usr/local/lib/python3.8/site-packages/pymongo/topology.py", line 215, in _select_servers_loop
make_migrations_1  |     raise ServerSelectionTimeoutError(
make_migrations_1  | pymongo.errors.ServerSelectionTimeoutError: mongodb:27017: [Errno -2] Name does not resolve, Timeout: 30s, Topology Description: <TopologyDescription id: 5fb23c4bc9495116fef1072a, topology_type: Single, servers: [<ServerDescription ('mongodb', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('mongodb:27017: [Errno -2] Name does not resolve')>]>
migration_1        | Traceback (most recent call last):
migration_1        |   File "manage.py", line 21, in <module>
migration_1        |     main()
migration_1        |   File "manage.py", line 17, in main
migration_1        |     execute_from_command_line(sys.argv)
migration_1        |   File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
migration_1        |     utility.execute()
migration_1        |   File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 375, in execute
migration_1        |     self.fetch_command(subcommand).run_from_argv(self.argv)
migration_1        |   File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 323, in run_from_argv
migration_1        |     self.execute(*args, **cmd_options)
migration_1        |   File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 364, in execute
migration_1        |     output = self.handle(*args, **options)
migration_1        |   File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 83, in wrapped
migration_1        |     res = handle_func(*args, **kwargs)
migration_1        |   File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/migrate.py", line 87, in handle
migration_1        |     executor = MigrationExecutor(connection, self.migration_progress_callback)
migration_1        |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/executor.py", line 18, in __init__
migration_1        |     self.loader = MigrationLoader(self.connection)
migration_1        |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 49, in __init__
migration_1        |     self.build_graph()
migration_1        |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 212, in build_graph
migration_1        |     self.applied_migrations = recorder.applied_migrations()
migration_1        |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 73, in applied_migrations
migration_1        |     if self.has_table():
migration_1        |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 56, in has_table
migration_1        |     return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
migration_1        |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/introspection.py", line 48, in table_names
migration_1        |     return get_names(cursor)
migration_1        |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/introspection.py", line 43, in get_names
migration_1        |     return sorted(ti.name for ti in self.get_table_list(cursor)
migration_1        |   File "/usr/local/lib/python3.8/site-packages/djongo/introspection.py", line 47, in get_table_list
migration_1        |     for c in cursor.db_conn.list_collection_names()
migration_1        |   File "/usr/local/lib/python3.8/site-packages/pymongo/database.py", line 863, in list_collection_names
migration_1        |     for result in self.list_collections(session=session, **kwargs)]
migration_1        |   File "/usr/local/lib/python3.8/site-packages/pymongo/database.py", line 825, in list_collections
migration_1        |     return self.__client._retryable_read(
migration_1        |   File "/usr/local/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1460, in _retryable_read
migration_1        |     server = self._select_server(
migration_1        |   File "/usr/local/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1278, in _select_server
migration_1        |     server = topology.select_server(server_selector)
migration_1        |   File "/usr/local/lib/python3.8/site-packages/pymongo/topology.py", line 241, in select_server
migration_1        |     return random.choice(self.select_servers(selector,
migration_1        |   File "/usr/local/lib/python3.8/site-packages/pymongo/topology.py", line 199, in select_servers
migration_1        |     server_descriptions = self._select_servers_loop(
migration_1        |   File "/usr/local/lib/python3.8/site-packages/pymongo/topology.py", line 215, in _select_servers_loop
migration_1        |     raise ServerSelectionTimeoutError(
migration_1        | pymongo.errors.ServerSelectionTimeoutError: mongodb:27017: [Errno -2] Name does not resolve, Timeout: 30s, Topology Description: <TopologyDescription id: 5fb23c4c69a8bce7b564bf46, topology_type: Single, servers: [<ServerDescription ('mongodb', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('mongodb:27017: [Errno -2] Name does not resolve')>]>
server_make_migrations_1 exited with code 1
server_migration_1 exited with code 1
webserver_1        | Exception in thread django-main-thread:
webserver_1        | Traceback (most recent call last):
webserver_1        |   File "/usr/local/lib/python3.8/threading.py", line 932, in _bootstrap_inner
webserver_1        |     self.run()
webserver_1        |   File "/usr/local/lib/python3.8/threading.py", line 870, in run
webserver_1        |     self._target(*self._args, **self._kwargs)
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/django/utils/autoreload.py", line 54, in wrapper
webserver_1        |     fn(*args, **kwargs)
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/runserver.py", line 120, in inner_run
webserver_1        |     self.check_migrations()
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 453, in check_migrations
webserver_1        |     executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/executor.py", line 18, in __init__
webserver_1        |     self.loader = MigrationLoader(self.connection)
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 49, in __init__
webserver_1        |     self.build_graph()
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 212, in build_graph
webserver_1        |     self.applied_migrations = recorder.applied_migrations()
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 73, in applied_migrations
webserver_1        |     if self.has_table():
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 56, in has_table
webserver_1        |     return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/introspection.py", line 48, in table_names
webserver_1        |     return get_names(cursor)
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/introspection.py", line 43, in get_names
webserver_1        |     return sorted(ti.name for ti in self.get_table_list(cursor)
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/djongo/introspection.py", line 47, in get_table_list
webserver_1        |     for c in cursor.db_conn.list_collection_names()
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/pymongo/database.py", line 863, in list_collection_names
webserver_1        |     for result in self.list_collections(session=session, **kwargs)]
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/pymongo/database.py", line 825, in list_collections
webserver_1        |     return self.__client._retryable_read(
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1460, in _retryable_read
webserver_1        |     server = self._select_server(
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1278, in _select_server
webserver_1        |     server = topology.select_server(server_selector)
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/pymongo/topology.py", line 241, in select_server
webserver_1        |     return random.choice(self.select_servers(selector,
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/pymongo/topology.py", line 199, in select_servers
webserver_1        |     server_descriptions = self._select_servers_loop(
webserver_1        |   File "/usr/local/lib/python3.8/site-packages/pymongo/topology.py", line 215, in _select_servers_loop
webserver_1        |     raise ServerSelectionTimeoutError(
webserver_1        | pymongo.errors.ServerSelectionTimeoutError: mongodb:27017: [Errno -2] Name does not resolve, Timeout: 30s, Topology Description: <TopologyDescription id: 5fb23c4d6fa2c64607ec6aee, topology_type: Single, servers: [<ServerDescription ('mongodb', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('mongodb:27017: [Errno -2] Name does not resolve')>]>
  

Как я могу решить эту проблему….

p.s что означает эта картинка ?! работает ли mongo с docker ?! введите описание изображения здесь

Комментарии:

1. [Ошибка -2] Имя не разрешается, ваше имя контейнера — mongo, а не mongodb, как вы установили в host

2. @iklinac Я изменил его, но он не работает с этим сообщением об ошибке pymongo.errors. InvalidURI: недопустимая схема URI: URI должен начинаться с ‘mongodb://’ или ‘mongodb srv://’

3. вы изменили схему, а не часть url