【问题标题】:AWS Postgresql RDS instance "does not exist" with docker-compose and Django带有 docker-compose 和 Django 的 AWS Postgresql RDS 实例“不存在”
【发布时间】:2021-11-13 03:03:38
【问题描述】:

我的 RDS 和 web 容器没有连接。

但是我在Django的设置里做了所有数据库相关的设置,AWS RDS也设置好了。

我还应该做些什么?

这是Django的设置文件的DATABASES

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": env("SQL_DATABASE"),
        "USER": env("SQL_USER"),
        "PASSWORD": env("SQL_PASSWORD"),
        "HOST": env("SQL_HOST"),
        "PORT": env("SQL_PORT"),
    }
}

我用nginx-proxyTLS 跳过了docker-compose.yml

当我在本地测试时,我在docker-compose 上制作并安装了数据库容器,但在prod 环境中,我没有制作数据库容器,因为我使用了AWS RDS。 这会是个问题吗?

请帮帮我。

(ps.PROJECT_NAME全部替换为实际项目名称。)

这是我的docker-compose.yml

version: '3.8'

services:

  web:
    build:
      context: .
      dockerfile: prod.Dockerfile
    image: project:web
    command: gunicorn PROJECT_NAME.wsgi:application --bind 0.0.0.0:8000
    env_file:
      - envs/.env.prod
    volumes:
      - static_volume:/home/app/web/static
      - media_volume:/home/app/web/media
    expose:
      - 8000
    entrypoint:
      - sh
      - config/docker/entrypoint.prod.sh

volumes:
  static_volume:
  media_volume:


这是我从docker得到的错误

Waiting for postgres...
PostgreSQL started

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 200, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/postgresql/base.py", line 187, in get_new_connection
    connection = Database.connect(**conn_params)
  File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 127, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: FATAL:  database "db-PROJECT_NAME-ec2" does not exist


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.8/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.8/site-packages/django/core/management/base.py", line 330, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 371, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 85, in wrapped
    res = handle_func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/migrate.py", line 92, in handle
    executor = MigrationExecutor(connection, self.migration_progress_callback)
  File "/usr/local/lib/python3.8/site-packages/django/db/migrations/executor.py", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
  File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 53, in __init__
    self.build_graph()
  File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 216, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 77, in applied_migrations
    if self.has_table():
  File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 55, in has_table
    with self.connection.cursor() as cursor:
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 259, in cursor
    return self._cursor()
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 235, in _cursor
    self.ensure_connection()
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 200, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/postgresql/base.py", line 187, in get_new_connection
    connection = Database.connect(**conn_params)
  File "/usr/local/lib/python3.8/site-packages/psycopg2/__init__.py", line 127, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
django.db.utils.OperationalError: FATAL:  database "db-PROJECT_NAME-ec2" does not exist

[2021-09-18 15:09:21 +0000] [1] [INFO] Starting gunicorn 20.0.4
[2021-09-18 15:09:21 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
[2021-09-18 15:09:21 +0000] [1] [INFO] Using worker: sync
[2021-09-18 15:09:21 +0000] [12] [INFO] Booting worker with pid: 12

【问题讨论】:

  • 当您使用我自己的客户端连接到您的 RDS 数据库集群时,您是否看到它包含一个 db-PROJECT_NAME-ec2 db?
  • 如果您没有在 docker 中设置数据库,为什么 docker 会说“等待 postgres...PostgreSQL 已启动”?
  • 使用密码编辑配置文件,使其密码错误。这应该澄清你是否真的在使用你认为的配置文件,如果是这样,那么新的错误消息可能会提供更多线索。
  • @LRutten 你的意思是,你问AWS RDS的DB id中是否有db-PROJECT_NAME-ec2?那么是的。
  • @LRutten 非常感谢您的回答。我解决了这个问题。当我在 RDS 中创建一个新数据库时,它就解决了。如您所说,在 RDS 中创建实例时似乎未正确设置数据库创建设置。并且数据库实例名称是 db-PROJECT_NAME-ec2,但数据库名称有一个单独的设置。

标签: django postgresql amazon-web-services docker-compose amazon-rds


【解决方案1】:

最可能的原因是AWS RDS 数据库实例名称与 PostgreSQL 数据库名称不同。

根据AWS RDS manual

对于数据库,选择新数据库实例的名称。

在 RDS 控制台上,将显示新数据库实例的详细信息。数据库实例的状态为正在创建,直到数据库实例被创建并可供使用。当状态变为 available 时,您可以连接到数据库实例。根据分配的数据库实例类和存储,新实例可能需要几分钟才能可用。

根据PostgreSQL: Documentation

dbname

指定要创建的数据库的名称。该名称在此集群中的所有 PostgreSQL 数据库中必须是唯一的。默认是创建一个与当前系统用户同名的数据库。

默认dbnamepostgres

因此,您可能想尝试使用 postgres 而不是 db-PROJECT_NAME-ec2 作为数据库名称。

【讨论】:

  • 虽然我已经解决了问题,但还是谢谢你的回答。默认数据库用户名是 postgres,但我创建 RDS 实例时默认数据库名不是 postgres。
猜你喜欢
  • 2020-08-12
  • 2021-06-07
  • 1970-01-01
  • 2014-06-24
  • 2017-06-05
  • 2018-03-09
  • 2019-06-08
  • 1970-01-01
  • 2015-11-16
相关资源
最近更新 更多