Django应用程序在通过docker-compose创建的安装程序中未连接到PostgreSQL

pw136qt2  于 2024-01-06  发布在  Docker
关注(0)|答案(1)|浏览(151)

我正在尝试通过docker compose运行一个带有PostgreSQL数据库的Django应用程序。这是我的docker-compose.yml

  1. version: '3.7'
  2. services:
  3. web:
  4. build: .
  5. command: sh -c "python manage.py runserver"
  6. volumes:
  7. - .:/immoscreen
  8. env_file:
  9. - .env
  10. environment:
  11. - APP_DB_ENGINE=${APP_DB_ENGINE}
  12. - APP_DB_HOST=${APP_DB_HOST}
  13. - APP_DB_PORT=${APP_DB_PORT}
  14. - APP_DB_NAME=${APP_DB_NAME}
  15. - APP_DB_USER=${APP_DB_USER}
  16. - APP_DB_PASSWORD=${APP_DB_PASSWORD}
  17. image: immoscreen_app
  18. ports:
  19. - ${DJANGO_APP_PORT}:${DJANGO_APP_PORT}
  20. expose:
  21. - ${DJANGO_APP_PORT}
  22. restart: "on-failure"
  23. depends_on:
  24. db:
  25. condition: service_healthy
  26. db:
  27. image: postgres
  28. volumes:
  29. - ./db/data/:/var/lib/postgresql/data/
  30. - ./db/init.sql/:/docker-entrypoint-initdb.d/
  31. env_file:
  32. - .env
  33. environment:
  34. - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
  35. - APP_DB_NAME=${APP_DB_NAME}
  36. - APP_DB_USER=${APP_DB_USER}
  37. - APP_DB_PASSWORD=${APP_DB_PASSWORD}
  38. ports:
  39. - 5432:5432
  40. healthcheck:
  41. test: ["CMD-SHELL", "pg_isready", "-d", "${APP_DB_NAME}", "-U", "${APP_DB_USER}"]
  42. interval: 10s
  43. timeout: 10s
  44. retries: 5
  45. start_period: 5s

字符串
以下是docker-compose.yml中引用的.env文件的相关部分:

  1. # PORT to run Django app on
  2. DJANGO_APP_PORT=8000
  3. # POSTGRES DB configuration
  4. APP_DB_ENGINE=django.db.backends.postgresql
  5. APP_DB_HOST=db
  6. APP_DB_PORT=5432
  7. APP_DB_NAME=immohub
  8. APP_DB_USER=immohub
  9. APP_DB_PASSWORD=thepassword
  10. # POSTGRES DB configuration
  11. POSTGRES_PASSWORD=postgres


此配置对db服务使用健康检查,并对web服务使用service_ready条件,以便在数据库就绪之前不启动Django应用程序。
数据库正在按预期使用存储在./db/init.sql/中的初始化脚本进行初始化。
我可以通过以下两种设置在运行此命令的机器上使用pgAdmin客户端连接到数据库:

  • postgres:postgres@localhost:5432/postgres
  • immohub:thepassword@localhost:5432/immohub

然而,web容器中的Django应用程序无法连接到数据库,即使db容器在之前报告数据库为rady以接受连接。以下是日志显示的内容:

  1. immohub-db-1 |
  2. immohub-db-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
  3. immohub-db-1 |
  4. immohub-db-1 |
  5. immohub-db-1 | 2023-12-19 11:34:20.723 UTC [1] LOG: starting PostgreSQL 16.1 (Debian 16.1-1.pgdg120+1) on aarch64-unknown-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
  6. immohub-db-1 | 2023-12-19 11:34:20.723 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
  7. immohub-db-1 | 2023-12-19 11:34:20.723 UTC [1] LOG: listening on IPv6 address "::", port 5432
  8. immohub-db-1 | 2023-12-19 11:34:20.724 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
  9. immohub-db-1 | 2023-12-19 11:34:20.730 UTC [30] LOG: database system was shut down at 2023-12-19 11:32:35 UTC
  10. immohub-db-1 | 2023-12-19 11:34:20.736 UTC [1] LOG: database system is ready to accept connections
  11. immohub-db-1 | 2023-12-19 11:34:30.348 UTC [41] FATAL: role "root" does not exist
  12. immohub-web-1 | Watching for file changes with StatReloader
  13. immohub-web-1 | Performing system checks...
  14. immohub-web-1 |
  15. immohub-web-1 |
  16. immohub-web-1 | System check identified no issues (0 silenced).
  17. immohub-web-1 | Exception in thread django-main-thread:
  18. immohub-web-1 | Traceback (most recent call last):
  19. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 289, in ensure_connection
  20. immohub-web-1 | self.connect()
  21. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
  22. immohub-web-1 | return func(*args, **kwargs)
  23. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 270, in connect
  24. immohub-web-1 | self.connection = self.get_new_connection(conn_params)
  25. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
  26. immohub-web-1 | return func(*args, **kwargs)
  27. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py", line 275, in get_new_connection
  28. immohub-web-1 |
  29. immohub-web-1 | connection = self.Database.connect(**conn_params)
  30. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/psycopg/connection.py", line 738, in connect
  31. immohub-web-1 |
  32. immohub-web-1 | raise ex.with_traceback(None)
  33. immohub-web-1 | psycopg.
  34. immohub-web-1 | OperationalError: connection failed: Connection refused
  35. immohub-web-1 | Is the server running on that host and accepting TCP/IP connections?
  36. immohub-web-1 |
  37. immohub-web-1 | The above exception was the direct cause of the following exception:
  38. immohub-web-1 |
  39. immohub-web-1 | Traceback (most recent call last):
  40. immohub-web-1 | File "/usr/local/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
  41. immohub-web-1 |
  42. immohub-web-1 | self.run()
  43. immohub-web-1 |
  44. immohub-web-1 |
  45. immohub-web-1 | File "/usr/local/lib/python3.10/threading.py", line 953, in run
  46. immohub-web-1 | self._target(*self._args, **self._kwargs)
  47. immohub-web-1 |
  48. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/utils/autoreload.py", line 64, in wrapper
  49. immohub-web-1 |
  50. immohub-web-1 |
  51. immohub-web-1 | fn(*args, **kwargs)
  52. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/core/management/commands/runserver.py", line 136, in inner_run
  53. immohub-web-1 | self.check_migrations()
  54. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/core/management/base.py", line 574, in check_migrations
  55. immohub-web-1 | executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
  56. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/migrations/executor.py", line 18, in __init__
  57. immohub-web-1 | self.loader = MigrationLoader(self.connection)
  58. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/migrations/loader.py", line 58, in __init__
  59. immohub-web-1 | self.build_graph()
  60. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/migrations/loader.py", line 235, in build_graph
  61. immohub-web-1 |
  62. immohub-web-1 | self.applied_migrations = recorder.applied_migrations()
  63. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/migrations/recorder.py", line 81, in applied_migrations
  64. immohub-web-1 | if self.has_table():
  65. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/migrations/recorder.py", line 57, in has_table
  66. immohub-web-1 | with self.connection.cursor() as cursor:
  67. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
  68. immohub-web-1 | return func(*args, **kwargs)
  69. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 330, in cursor
  70. immohub-web-1 | return self._cursor()
  71. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 306, in _cursor
  72. immohub-web-1 |
  73. immohub-web-1 | self.ensure_connection()
  74. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
  75. immohub-web-1 |
  76. immohub-web-1 | return func(*args, **kwargs)
  77. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 288, in ensure_connection
  78. immohub-web-1 |
  79. immohub-web-1 | with self.wrap_database_errors:
  80. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/utils.py", line 91, in __exit__
  81. immohub-web-1 | raise dj_exc_value.with_traceback(traceback) from exc_value
  82. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 289, in ensure_connection
  83. immohub-web-1 | self.connect()
  84. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
  85. immohub-web-1 |
  86. immohub-web-1 | return func(*args, **kwargs)
  87. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 270, in connect
  88. immohub-web-1 | self.connection = self.get_new_connection(conn_params)
  89. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
  90. immohub-web-1 | return func(*args, **kwargs)
  91. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py", line 275, in get_new_connection
  92. immohub-web-1 | connection = self.Database.connect(**conn_params)
  93. immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/psycopg/connection.py", line 738, in connect
  94. immohub-web-1 | raise ex.with_traceback(None)
  95. immohub-web-1 | django.db.utils.OperationalError: connection failed: Connection refused
  96. immohub-web-1 | Is the server running on that host and accepting TCP/IP connections?


我还尝试使用localhost作为Django应用程序的DB主机,同样失败了。
当我在web容器的终端中运行ping db时,我得到:

  1. # ping db
  2. PING db (172.22.0.2) 56(84) bytes of data.
  3. 64 bytes from immohub-db-1.immohub_default (172.22.0.2): icmp_seq=1 ttl=64 time=0.263 ms


有人能看到/解释我错过了什么吗?

p5fdfcr1

p5fdfcr11#

经过一些故障排除,这似乎与docker-compose如何构建网络配置有关。在web服务的主机文件中没有db服务的条目。手动添加一个后,web服务可以ping db主机。我在Github上创建了一个关于docker-compose问题跟踪器的新帖子:https://github.com/docker/compose/issues/11293

相关问题