Django + Mongo + Docker 获取 pymongo.errors.ServerSelectionTimeoutError

2023-12-09

我一直在努力使用 Django、Djongo、Mongodb 和 Docker Compose 运行一个简单的应用程序。我的设置如下所示:

docker-compose.yml

services:
  mongodb:
    image: mongo:latest
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: mongoadmin
      MONGO_INITDB_DATABASE: django_mongodb_docker
    ports:
      - 27017:27017

  web:
    build: ./src
    restart: always
    command: python src/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - 8000:8000
    links:
      - mongodb

Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED=1
RUN mkdir /code
COPY . /code/
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt

设置.py

DATABASES = {
    'default': {
        'ENGINE': 'djongo',
        'HOST': 'mongodb',
        'PORT': 27017,
        'USER': 'root',
        'PASSWORD': 'mongoadmin',
        'AUTH_SOURCE': 'admin',
        'AUTH_MECHANISM': 'SCRAM-SHA-1',
    }
}

令人烦恼的是,我能够从我的 Web 容器中使用 pymongo 连接到运行 mongo 的容器。其工作原理如下。

from pymongo import MongoClient

c = MongoClient(
    'mongodb://mongodb:27017',
    username='root',
    password='mongoadmin',
    authSource='admin',
    authMechanism='SCRAM-SHA-1')

print(c.server_info())

问题是,当我从 Web 容器中运行迁移时,出现以下错误。

Traceback (most recent call last):
  File "/code/src/manage.py", line 22, in <module>
    main()
  File "/code/src/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.9/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.9/site-packages/django/core/management/__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.9/site-packages/django/core/management/base.py", line 330, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.9/site-packages/django/core/management/base.py", line 371, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python3.9/site-packages/django/core/management/base.py", line 85, in wrapped
    res = handle_func(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/django/core/management/commands/migrate.py", line 92, in handle
    executor = MigrationExecutor(connection, self.migration_progress_callback)
  File "/usr/local/lib/python3.9/site-packages/django/db/migrations/executor.py", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
  File "/usr/local/lib/python3.9/site-packages/django/db/migrations/loader.py", line 53, in __init__
    self.build_graph()
  File "/usr/local/lib/python3.9/site-packages/django/db/migrations/loader.py", line 216, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File "/usr/local/lib/python3.9/site-packages/django/db/migrations/recorder.py", line 77, in applied_migrations
    if self.has_table():
  File "/usr/local/lib/python3.9/site-packages/django/db/migrations/recorder.py", line 56, in has_table
    tables = self.connection.introspection.table_names(cursor)
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/base/introspection.py", line 48, in table_names
    return get_names(cursor)
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/base/introspection.py", line 43, in get_names
    return sorted(ti.name for ti in self.get_table_list(cursor)
  File "/usr/local/lib/python3.9/site-packages/djongo/introspection.py", line 47, in get_table_list
    for c in cursor.db_conn.list_collection_names()
  File "/usr/local/lib/python3.9/site-packages/pymongo/database.py", line 863, in list_collection_names
    for result in self.list_collections(session=session, **kwargs)]
  File "/usr/local/lib/python3.9/site-packages/pymongo/database.py", line 825, in list_collections
    return self.__client._retryable_read(
  File "/usr/local/lib/python3.9/site-packages/pymongo/mongo_client.py", line 1460, in _retryable_read
    server = self._select_server(
  File "/usr/local/lib/python3.9/site-packages/pymongo/mongo_client.py", line 1278, in _select_server
    server = topology.select_server(server_selector)
  File "/usr/local/lib/python3.9/site-packages/pymongo/topology.py", line 241, in select_server
    return random.choice(self.select_servers(selector,
  File "/usr/local/lib/python3.9/site-packages/pymongo/topology.py", line 199, in select_servers
    server_descriptions = self._select_servers_loop(
  File "/usr/local/lib/python3.9/site-packages/pymongo/topology.py", line 215, in _select_servers_loop
    raise ServerSelectionTimeoutError(
pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused, Timeout: 30s, Topology Description: <TopologyDescription id: 5f9ecaa5bbdc0433baa13966, topology_type: Single, servers: [<ServerDescription ('localhost', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('localhost:27017: [Errno 111] Connection refused')>]>

此外,我尝试创建一个 Djongo 模型并将其保存,以查看问题是否特定于迁移(本质上只是尝试使用 djongo 与 mongo 建立任何连接)。

模型.py

from djongo import models

class Blog(models.Model):
    name = models.CharField(max_length=100)

test.py

b = Blog(name='test')
b.save()

这会返回以下错误:

The above exception was the direct cause of the following exception:
web_1      | 
web_1      | Traceback (most recent call last):
web_1      |   File "/usr/local/lib/python3.9/site-packages/djongo/cursor.py", line 51, in execute
web_1      |     self.result = Query(
web_1      |   File "/usr/local/lib/python3.9/site-packages/djongo/sql2mongo/query.py", line 783, in __init__
web_1      |     self._query = self.parse()
web_1      |   File "/usr/local/lib/python3.9/site-packages/djongo/sql2mongo/query.py", line 884, in parse
web_1      |     raise exe from e
web_1      | djongo.exceptions.SQLDecodeError: 
web_1      | 
web_1      |    Keyword: None
web_1      |    Sub SQL: None
web_1      |    FAILED SQL: INSERT INTO "game_blog" ("name") VALUES (%(0)s)
web_1      |    Params: ['test']
web_1      |    Version: 1.3.3
web_1      | 
web_1      | The above exception was the direct cause of the following exception:
web_1      | 
web_1      | Traceback (most recent call last):
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
web_1      |     return self.cursor.execute(sql, params)
web_1      |   File "/usr/local/lib/python3.9/site-packages/djongo/cursor.py", line 59, in execute
web_1      |     raise db_exe from e
web_1      | djongo.database.DatabaseError
web_1      | 
web_1      | The above exception was the direct cause of the following exception:
web_1      | 
web_1      | Traceback (most recent call last):
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
web_1      |     response = get_response(request)
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/core/handlers/base.py", line 179, in _get_response
web_1      |     response = wrapped_callback(request, *callback_args, **callback_kwargs)
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/views/generic/base.py", line 70, in view
web_1      |     return self.dispatch(request, *args, **kwargs)
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/views/generic/base.py", line 98, in dispatch
web_1      |     return handler(request, *args, **kwargs)
web_1      |   File "/code/src/game/views.py", line 9, in get
web_1      |     b.save(using='mongo')
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/db/models/base.py", line 753, in save
web_1      |     self.save_base(using=using, force_insert=force_insert,
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/db/models/base.py", line 790, in save_base
web_1      |     updated = self._save_table(
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/db/models/base.py", line 895, in _save_table
web_1      |     results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/db/models/base.py", line 933, in _do_insert
web_1      |     return manager._insert(
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/db/models/manager.py", line 85, in manager_method
web_1      |     return getattr(self.get_queryset(), name)(*args, **kwargs)
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 1254, in _insert
web_1      |     return query.get_compiler(using=using).execute_sql(returning_fields)
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1397, in execute_sql
web_1      |     cursor.execute(sql, params)
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 98, in execute
web_1      |     return super().execute(sql, params)
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 66, in execute
web_1      |     return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
web_1      |     return executor(sql, params, many, context)
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
web_1      |     return self.cursor.execute(sql, params)
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/db/utils.py", line 90, in __exit__
web_1      |     raise dj_exc_value.with_traceback(traceback) from exc_value
web_1      |   File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
web_1      |     return self.cursor.execute(sql, params)
web_1      |   File "/usr/local/lib/python3.9/site-packages/djongo/cursor.py", line 59, in execute
web_1      |     raise db_exe from e
web_1      | django.db.utils.DatabaseError

对此的任何帮助将不胜感激。

我尝试编辑我的 mongodb.conf 像this已经。


根据这个文件, the settings.py应该有一个CLIENT部分包含:

一组键值对,在创建新的客户端连接时将作为 kwargs 直接传递给 MongoClient。

所以尝试设置你的settings.py to:

DATABASE = {
    'default': {
        'ENGINE': 'djongo',
        'NAME': 'your-database-name',
        'CLIENT': {
            'host': 'mongodb://mongodb:27017',
            'username': 'root',
            'password': 'mongoadmin',
            'authSource': 'admin',
            'authMechanism': 'SCRAM-SHA-1',
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django + Mongo + Docker 获取 pymongo.errors.ServerSelectionTimeoutError 的相关文章

随机推荐

  • 数据库设计 - 链接两个用户

    我需要一些数据库设计方面的帮助 我是一名 FE 开发人员 只处理过非常基本的数据库 我刚刚开始涉足更 高级 的网络应用程序 并且想要一些指向架构正确方向的指针 我正在寻找的是一个基本上可以链接两个帐户的帐户系统 我将向您展示我脑海中想象的场
  • Pandas:如何读取同一单元格上多行的 csv?

    我有一个csv我无法使用它来阅读read csv打开csv与崇高的文字显示类似 col1 col2 col3 text 2 3 more text 3 4 HELLO THIS IS FUN 3 4 正如你所看到的 文本HELLO THIS
  • C语言中什么时候使用break、continue?

    C语言中什么时候使用break continue 我可以在带循环和不带循环的情况下使用它们吗 如果循环中的条件足以指示是否继续或不继续 那么需要使用它们吗 使用它们是一个好的做法吗 提前致谢 您可能决定当前循环迭代不应再运行 并希望立即开始
  • 使用构造函数和使用 .init 有区别吗?

    假设我有一堂课 class Fruit var fruitName String init getFruit name String fruitName name 使用构造函数和使用 init 有什么区别吗 var apple Fruit
  • vsts中msbuild的路径是什么

    asp net web表单项目需要迁移到vsts 该项目使用python脚本来构建和发布 在代码中它调用msbuild exe 但是 我很困惑如何在 vsts 中引用 msbuild 位置来替换 python 文件中的先前位置 您可以从托管
  • jQuery 验证始终返回 true

    我有这个html
  • YouTube Api - 无法搜索:com.google.api.client.googleapis.json.GoogleJsonResponseException:403 Forbidden

    我一直在关注本教程创建 Youtube 应用程序 我创建了 Browser Android API Key 并在我的项目中尝试了它们 但是当我尝试运行它并搜索时我得到 Could not search com google api clie
  • Rails 迁移:建立_连接在错误的数据库中创建表

    我想在数据库中创建一个新表 而不是在我的database yml 文件中定义的表 这是我的database yml 文件 development adapter mysql2
  • 如何:使用 wix 工具集使程序在 Windows 启动时启动?

    我有简单的 Hello world Windows 窗体应用程序 在 VS 2013 中创建 如何使用 WIX Toolset 使应用程序在 Windows 启动时启动 必须在 Windows 7 和 Windows 8 中运行 这是我目前
  • 带有 angularjs 的材料设计 md-tabs

    我有一个关于材料设计 md tabs 控制的问题 我在其中一个页面上使用 md tabs 和 Angularjs 效果很好 我在该页面上还有一个 md 按钮 我们想要做的是 当用户单击该按钮时 我们想要移动到下一个选项卡 我对整个材料角度的
  • Java 类型泛型作为 GSON 的参数

    在 GSON 中获取你所做的对象列表 Gson gson new Gson Type token new TypeToken
  • 使用 MongoDB 压缩数组

    是否可以在 mongo 文档中压缩数组 我指的是 zip 的函数式编程定义 其中相应的项被配对成元组 更准确地说 我想从这样的 mongo 文档开始 A A1 A2 A3 B B1 B2 B3 C 100 0 200 0 300 0 最终得
  • 连接到与登录 google colab 不同的 google 驱动器

    最近 colab 删除了从您在 google 云端硬盘中登录的帐户以外的其他帐户连接到 google 云端硬盘的功能 有人发布了一个使用以下代码的解决方法 效果很好 直到现在 apt get install y qq software pr
  • 理解结构等价

    我有两种类型的结构等价思想我正在努力理解 VAR 1 int VAR 2 pointer to VAR 1 所以在这里 我觉得它们在结构上是等效的 因为从技术上讲 这些类型都指向整数类型 对吗 但如果你有类似的东西 VAR 3 pointe
  • Crystal Report Viewer 打印/导出按钮在 ASP.NET MVC 应用程序中不起作用

    我的 MVC 应用程序使用推送模型和 CR 查看器进行报告 在查看器中显示报告时一切都很好 但是打印 导出按钮给出了 JavaScript 错误 此操作不支持对象 我正在使用 VS 2008 和 MVC 这发生在我的开发环境中 有任何想法吗
  • Android 中的自定义字体(适用于整个应用程序)[重复]

    这个问题在这里已经有答案了 我有这个 android 代码 其中有许多类 每个类都有不同的视图 我们可以进入设置并根据所选的字体更改其字体 目前仅预装的 Android 字体可用 有没有办法稍微调整我的代码 以便我可以添加 ttf 文件并将
  • 如何知道 Azure 服务器是否使用 TLS 1.2

    我们有一个托管在 Azure 服务器中的 Web 应用程序 使用 Azure 服务器中的 api 出于安全目的 我们想知道服务器是否处于 tls 1 2 之下 我想对于非云服务器 我们只需在 regedit 中查看即可知道 我已经看到有关如
  • 线程是内核对象吗?

    在这本书中 我读到每个实例Thread类实际上正在分配一个内核对象 这是使用的开销之一Thread 据我所知 线程不是内核对象 在这种情况下只有进程是内核对象 进程包含的线程不是内核对象 有人可以解释一下吗 线程首先是一个托管对象 你知道S
  • 如何将 JavaScript 侦听器添加到 PrimeFaces Ajax 事件

    我想通过javascript方法监听pickList传输事件 侦听器与 java bean 配合良好
  • Django + Mongo + Docker 获取 pymongo.errors.ServerSelectionTimeoutError

    我一直在努力使用 Django Djongo Mongodb 和 Docker Compose 运行一个简单的应用程序 我的设置如下所示 docker compose yml services mongodb image mongo lat