我正在尝试通过docker compose运行一个带有PostgreSQL数据库的Django应用程序。这是我的docker-compose.yml
:
version: '3.7'
services:
web:
build: .
command: sh -c "python manage.py runserver"
volumes:
- .:/immoscreen
env_file:
- .env
environment:
- APP_DB_ENGINE=${APP_DB_ENGINE}
- APP_DB_HOST=${APP_DB_HOST}
- APP_DB_PORT=${APP_DB_PORT}
- APP_DB_NAME=${APP_DB_NAME}
- APP_DB_USER=${APP_DB_USER}
- APP_DB_PASSWORD=${APP_DB_PASSWORD}
image: immoscreen_app
ports:
- ${DJANGO_APP_PORT}:${DJANGO_APP_PORT}
expose:
- ${DJANGO_APP_PORT}
restart: "on-failure"
depends_on:
db:
condition: service_healthy
db:
image: postgres
volumes:
- ./db/data/:/var/lib/postgresql/data/
- ./db/init.sql/:/docker-entrypoint-initdb.d/
env_file:
- .env
environment:
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- APP_DB_NAME=${APP_DB_NAME}
- APP_DB_USER=${APP_DB_USER}
- APP_DB_PASSWORD=${APP_DB_PASSWORD}
ports:
- 5432:5432
healthcheck:
test: ["CMD-SHELL", "pg_isready", "-d", "${APP_DB_NAME}", "-U", "${APP_DB_USER}"]
interval: 10s
timeout: 10s
retries: 5
start_period: 5s
字符串
以下是docker-compose.yml
中引用的.env
文件的相关部分:
# PORT to run Django app on
DJANGO_APP_PORT=8000
# POSTGRES DB configuration
APP_DB_ENGINE=django.db.backends.postgresql
APP_DB_HOST=db
APP_DB_PORT=5432
APP_DB_NAME=immohub
APP_DB_USER=immohub
APP_DB_PASSWORD=thepassword
# POSTGRES DB configuration
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以接受连接。以下是日志显示的内容:
immohub-db-1 |
immohub-db-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
immohub-db-1 |
immohub-db-1 |
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
immohub-db-1 | 2023-12-19 11:34:20.723 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
immohub-db-1 | 2023-12-19 11:34:20.723 UTC [1] LOG: listening on IPv6 address "::", port 5432
immohub-db-1 | 2023-12-19 11:34:20.724 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
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
immohub-db-1 | 2023-12-19 11:34:20.736 UTC [1] LOG: database system is ready to accept connections
immohub-db-1 | 2023-12-19 11:34:30.348 UTC [41] FATAL: role "root" does not exist
immohub-web-1 | Watching for file changes with StatReloader
immohub-web-1 | Performing system checks...
immohub-web-1 |
immohub-web-1 |
immohub-web-1 | System check identified no issues (0 silenced).
immohub-web-1 | Exception in thread django-main-thread:
immohub-web-1 | Traceback (most recent call last):
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 289, in ensure_connection
immohub-web-1 | self.connect()
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
immohub-web-1 | return func(*args, **kwargs)
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 270, in connect
immohub-web-1 | self.connection = self.get_new_connection(conn_params)
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
immohub-web-1 | return func(*args, **kwargs)
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py", line 275, in get_new_connection
immohub-web-1 |
immohub-web-1 | connection = self.Database.connect(**conn_params)
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/psycopg/connection.py", line 738, in connect
immohub-web-1 |
immohub-web-1 | raise ex.with_traceback(None)
immohub-web-1 | psycopg.
immohub-web-1 | OperationalError: connection failed: Connection refused
immohub-web-1 | Is the server running on that host and accepting TCP/IP connections?
immohub-web-1 |
immohub-web-1 | The above exception was the direct cause of the following exception:
immohub-web-1 |
immohub-web-1 | Traceback (most recent call last):
immohub-web-1 | File "/usr/local/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
immohub-web-1 |
immohub-web-1 | self.run()
immohub-web-1 |
immohub-web-1 |
immohub-web-1 | File "/usr/local/lib/python3.10/threading.py", line 953, in run
immohub-web-1 | self._target(*self._args, **self._kwargs)
immohub-web-1 |
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/utils/autoreload.py", line 64, in wrapper
immohub-web-1 |
immohub-web-1 |
immohub-web-1 | fn(*args, **kwargs)
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/core/management/commands/runserver.py", line 136, in inner_run
immohub-web-1 | self.check_migrations()
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/core/management/base.py", line 574, in check_migrations
immohub-web-1 | executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/migrations/executor.py", line 18, in __init__
immohub-web-1 | self.loader = MigrationLoader(self.connection)
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/migrations/loader.py", line 58, in __init__
immohub-web-1 | self.build_graph()
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/migrations/loader.py", line 235, in build_graph
immohub-web-1 |
immohub-web-1 | self.applied_migrations = recorder.applied_migrations()
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/migrations/recorder.py", line 81, in applied_migrations
immohub-web-1 | if self.has_table():
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/migrations/recorder.py", line 57, in has_table
immohub-web-1 | with self.connection.cursor() as cursor:
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
immohub-web-1 | return func(*args, **kwargs)
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 330, in cursor
immohub-web-1 | return self._cursor()
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 306, in _cursor
immohub-web-1 |
immohub-web-1 | self.ensure_connection()
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
immohub-web-1 |
immohub-web-1 | return func(*args, **kwargs)
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 288, in ensure_connection
immohub-web-1 |
immohub-web-1 | with self.wrap_database_errors:
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/utils.py", line 91, in __exit__
immohub-web-1 | raise dj_exc_value.with_traceback(traceback) from exc_value
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 289, in ensure_connection
immohub-web-1 | self.connect()
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
immohub-web-1 |
immohub-web-1 | return func(*args, **kwargs)
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 270, in connect
immohub-web-1 | self.connection = self.get_new_connection(conn_params)
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
immohub-web-1 | return func(*args, **kwargs)
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py", line 275, in get_new_connection
immohub-web-1 | connection = self.Database.connect(**conn_params)
immohub-web-1 | File "/usr/local/lib/python3.10/site-packages/psycopg/connection.py", line 738, in connect
immohub-web-1 | raise ex.with_traceback(None)
immohub-web-1 | django.db.utils.OperationalError: connection failed: Connection refused
immohub-web-1 | Is the server running on that host and accepting TCP/IP connections?
型
我还尝试使用localhost
作为Django应用程序的DB主机,同样失败了。
当我在web
容器的终端中运行ping db
时,我得到:
# ping db
PING db (172.22.0.2) 56(84) bytes of data.
64 bytes from immohub-db-1.immohub_default (172.22.0.2): icmp_seq=1 ttl=64 time=0.263 ms
型
有人能看到/解释我错过了什么吗?
1条答案
按热度按时间p5fdfcr11#
经过一些故障排除,这似乎与docker-compose如何构建网络配置有关。在
web
服务的主机文件中没有db
服务的条目。手动添加一个后,web
服务可以pingdb
主机。我在Github上创建了一个关于docker-compose问题跟踪器的新帖子:https://github.com/docker/compose/issues/11293