#django #postgresql #amazon-web-services #docker-compose #amazon-rds
Вопрос:
Мой RDS и веб — контейнер не подключены.
Но я выполнил все настройки, связанные с базой данных, в настройках Django
, и я также AWS RDS
правильно настроился.
Что я должен делать больше?
Это DATABASES
файл настроек Django
.
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"),
}
}
Я пропустил docker-compose.yml
операцию «с nginx-proxy
или TLS
«.
Когда я тестировал в локальной среде, я создавал и монтировал контейнеры БД 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
Комментарии:
1. Когда вы подключаетесь к кластеру баз данных RDS, например, с помощью клиента myself, видите ли вы, что он содержит базу данных db-PROJECT_NAME-ec2?
2. Почему докер говорит»В ожидании postgres… Запущен PostgreSQL» если вы не настраиваете базу данных в docker?
3. отредактируйте файл конфигурации с паролем, чтобы в нем был неверный пароль. Это должно прояснить, действительно ли вы используете файл конфигурации, о котором вы думаете, и если да, то новое сообщение об ошибке может дать еще несколько подсказок.
4. @LRutten Вы имеете в виду, вы спрашиваете, есть ли db-ИМЯ_ПРОЕКТА-ec2 в идентификаторе базы данных AWS RDS? Тогда да.
5. @LRutten Большое вам спасибо за ваши ответы. Я решил эту проблему. Когда я создал новую базу данных в RDS, это было решено. Как вы уже сказали, похоже, что настройка создания БД была неправильно настроена при создании экземпляра в RDS. И имя экземпляра БД было db-ИМЯ_ПРОЕКТА-ec2, но имя БД имело отдельную настройку.
Ответ №1:
Наиболее вероятная причина заключается в том, что AWS RDS
имя экземпляра БД отличается от имени БД PostgreSQL.
В соответствии с руководством AWS RDS
Для баз данных выберите имя нового экземпляра БД.
На консоли RDS отображаются сведения о новом экземпляре БД. Экземпляр БД находится в состоянии создания до тех пор, пока экземпляр БД не будет создан и готов к использованию. Когда состояние изменится на доступно, вы сможете подключиться к экземпляру БД. В зависимости от класса экземпляра БД и выделенного хранилища, доступ к новому экземпляру может занять несколько минут.
Согласно PostgreSQL: Документация
dbname
Указывает имя создаваемой базы данных. Имя должно быть уникальным среди всех баз данных PostgreSQL в этом кластере. По умолчанию создается база данных с тем же именем, что и у текущего системного пользователя.
Значение по умолчанию dbname
равно postgres
Таким образом, вы можете попробовать postgres
вместо db-PROJECT_NAME-ec2
этого использовать имя базы данных.
Комментарии:
1. Хотя я уже решил эту проблему, спасибо вам за ваш ответ. Имя пользователя БД по умолчанию-postgres, но имя БД по умолчанию не было postgres, когда я создавал экземпляр RDS.