簡體   English   中英

將 django 應用程序連接到 postgres 容器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM