[英]Connecting django app to postgres container
我很難將我的 Django 容器應用程序連接到我的 Postgres 容器。 Postgres 應用程序的 docker compose 語句如下:
version: '3'
services:
database:
image: "postgres" # use latest official postgres version
restart: unless-stopped
env_file:
- ./database.env # configure postgres
networks:
- djangonetwork
ports:
- "5433:5432"
volumes:
- database-data:/var/lib/postgresql/data/ # persist data even if container shuts down
volumes:
database-data: # named volumes can be managed easier using docker-compose
networks:
djangonetwork:
driver: bridge
Django 應用程序的 compose 語句如下:
services:
app:
build: .
container_name: app
command: >
bash -c "python manage.py makemigrations &&
python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
networks:
- djangonetwork
ports:
- 10555:8000
environment:
aws_access_key_id: ${aws_access_key_id}
aws_secret_access_key: ${aws_secret_access_key}
networks:
djangonetwork:
driver: bridge
執行 docker 組合語句時出現困難。 我嘗試了許多不同的 POSTGRES_HOST 值(注意它們是從 Amazon Secrets Manager 中成功檢索到的)。 我收到以下日志 output:
[+] Running 1/0
⠿ Container app Created 0.0s
Attaching to app
app | /usr/local/lib/python3.10/site-packages/django/core/management/commands/makemigrations.py:105: RuntimeWarning: Got an error checking a consistent migration history performed for database connection 'default': could not translate host name "postgres" to address: Name or service not known
app |
app | warnings.warn(
app | No changes detected
app | Traceback (most recent call last):
app | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 230, in ensure_connection
app | self.connect()
app | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 25, in inner
app | return func(*args, **kwargs)
app | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 211, in connect
app | self.connection = self.get_new_connection(conn_params)
app | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 25, in inner
app | return func(*args, **kwargs)
app | File "/usr/local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py", line 199, in get_new_connection
app | connection = Database.connect(**conn_params)
app | File "/usr/local/lib/python3.10/site-packages/psycopg2/__init__.py", line 122, in connect
app | conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
app | psycopg2.OperationalError: could not translate host name "postgres" to address: Name or service not known
app |
app |
app | The above exception was the direct cause of the following exception:
app |
app | Traceback (most recent call last):
app | File "/code/manage.py", line 22, in <module>
app | main()
app | File "/code/manage.py", line 18, in main
app | execute_from_command_line(sys.argv)
app | File "/usr/local/lib/python3.10/site-packages/django/core/management/__init__.py", line 425, in execute_from_command_line
app | utility.execute()
app | File "/usr/local/lib/python3.10/site-packages/django/core/management/__init__.py", line 419, in execute
app | self.fetch_command(subcommand).run_from_argv(self.argv)
app | File "/usr/local/lib/python3.10/site-packages/django/core/management/base.py", line 373, in run_from_argv
app | self.execute(*args, **cmd_options)
app | File "/usr/local/lib/python3.10/site-packages/django/core/management/base.py", line 417, in execute
app | output = self.handle(*args, **options)
app | File "/usr/local/lib/python3.10/site-packages/django/core/management/base.py", line 90, in wrapped
app | res = handle_func(*args, **kwargs)
app | File "/usr/local/lib/python3.10/site-packages/django/core/management/commands/migrate.py", line 75, in handle
app | self.check(databases=[database])
app | File "/usr/local/lib/python3.10/site-packages/django/core/management/base.py", line 438, in check
app | all_issues = checks.run_checks(
app | File "/usr/local/lib/python3.10/site-packages/django/core/checks/registry.py", line 77, in run_checks
app | new_errors = check(app_configs=app_configs, databases=databases)
app | File "/usr/local/lib/python3.10/site-packages/django/core/checks/model_checks.py", line 34, in check_all_models
app | errors.extend(model.check(**kwargs))
app | File "/usr/local/lib/python3.10/site-packages/django/db/models/base.py", line 1307, in check
app | *cls._check_indexes(databases),
app | File "/usr/local/lib/python3.10/site-packages/django/db/models/base.py", line 1699, in _check_indexes
app | connection.features.supports_covering_indexes or
app | File "/usr/local/lib/python3.10/site-packages/django/utils/functional.py", line 48, in __get__
app | res = instance.__dict__[self.name] = self.func(instance)
app | File "/usr/local/lib/python3.10/site-packages/django/db/backends/postgresql/features.py", line 84, in is_postgresql_11
app | return self.connection.pg_version >= 110000
app | File "/usr/local/lib/python3.10/site-packages/django/utils/functional.py", line 48, in __get__
app | res = instance.__dict__[self.name] = self.func(instance)
app | File "/usr/local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py", line 339, in pg_version
app | with self.temporary_connection():
app | File "/usr/local/lib/python3.10/contextlib.py", line 135, in __enter__
app | return next(self.gen)
app | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 614, in temporary_connection
app | with self.cursor() as cursor:
app | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 25, in inner
app | return func(*args, **kwargs)
app | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 270, in cursor
app | return self._cursor()
app | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 246, in _cursor
app | self.ensure_connection()
app | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 25, in inner
app | return func(*args, **kwargs)
app | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 229, in ensure_connection
app | with self.wrap_database_errors:
app | File "/usr/local/lib/python3.10/site-packages/django/db/utils.py", line 90, in __exit__
app | raise dj_exc_value.with_traceback(traceback) from exc_value
app | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 230, in ensure_connection
app | self.connect()
app | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 25, in inner
app | return func(*args, **kwargs)
app | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 211, in connect
app | self.connection = self.get_new_connection(conn_params)
app | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 25, in inner
app | return func(*args, **kwargs)
app | File "/usr/local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py", line 199, in get_new_connection
app | connection = Database.connect(**conn_params)
app | File "/usr/local/lib/python3.10/site-packages/psycopg2/__init__.py", line 122, in connect
app | conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
app | django.db.utils.OperationalError: could not translate host name "postgres" to address: Name or service not known
app |
app exited with code 1
我不知所措。 我應該使用什么 POSTGRES_HOST 值? 我應該以不同的方式建立網絡設置嗎?
手動創建網絡,然后為每個獨立容器使用外部連接是成功的。 在 shell 中啟動網絡的腳本:
docker network create --driver=bridge dbnet
修改后的 Postgres yaml (注意我在這個版本中修改了端口設置以簡化):
version: '3'
services:
database:
image: "postgres" # use latest official postgres version
restart: unless-stopped
env_file:
- ./database.env # configure postgres
networks:
- dbnet
ports:
- "5432:5432"
volumes:
- database-data:/var/lib/postgresql/data/ # persist data even if container shuts down
volumes:
database-data: # named volumes can be managed easier using docker-compose
networks:
dbnet:
external: true
修改后的 Django yaml 腳本:
version: '3'
services:
app:
build: .
container_name: app
command: >
bash -c "python manage.py makemigrations &&
python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
networks:
- dbnet
ports:
- 10555:8000
environment:
aws_access_key_id: ${aws_access_key_id}
aws_secret_access_key: ${aws_secret_access_key}
networks:
dbnet:
external: true
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.