从运行在主机上的django连接到docker容器中的postgres数据库



我有一个postgres数据库运行在一个容器与pgadmin连接到它,docker-compose。Yml如下:

postgres:
image: postgres:13.0-alpine
volumes:
- postgres:/var/lib/postgresql/data
ports:
- "5432:5432"
env_file:
- $ENV_FILE
pgadmin:
image: dpage/pgadmin4
volumes:
- pgadmin:/var/lib/pgadmin
ports:
- "${PGADMIN_PORT:-5050}:80"
restart: unless-stopped
depends_on:
- postgres
env_file:
- $ENV_FILE

我的django数据库设置如下:

DATABASES = {
"default": {
"ENGINE": os.environ.get("POSTGRES_ENGINE", "django.db.backends.postgresql"),
"NAME": os.environ.get("POSTGRES_NAME", "postgres"),
"USER": os.environ.get("POSTGRES_USER", "admin"),
"PASSWORD": os.environ.get("POSTGRES_PASS", "admin"),
"HOST": os.environ.get("POSTGRES_HOST", "127.0.0.1"),
"PORT": os.environ.get("POSTGRES_PORT", "5432"),
}
}

回溯为:

Traceback (most recent call last):
File "C:Usersliam.obrienAppDataLocalProgramsPythonPython310libthreading.py", line 1009, in _bootstrap_inner
self.run()
File "C:Usersliam.obrienAppDataLocalProgramsPythonPython310libthreading.py", line 946, in run
self._target(*self._args, **self._kwargs)
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangoutilsautoreload.py", line 64, in wrapper
fn(*args, **kwargs)
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packageschannelsmanagementcommandsrunserver.py", line 76, in inner_run
self.check_migrations()
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangocoremanagementbase.py", line 576, in check_migrations
executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangodbmigrationsexecutor.py", line 18, in __init__
self.loader = MigrationLoader(self.connection)
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangodbmigrationsloader.py", line 58, in __init__
self.build_graph()
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangodbmigrationsloader.py", line 235, in build_graph
self.applied_migrations = recorder.applied_migrations()
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangodbmigrationsrecorder.py", line 81, in applied_migrations
if self.has_table():
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangodbmigrationsrecorder.py", line 57, in has_table
with self.connection.cursor() as cursor:
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangoutilsasyncio.py", line 26, in inner
return func(*args, **kwargs)
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangodbbackendsbasebase.py", line 284, in cursor
return self._cursor()
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangodbbackendsbasebase.py", line 260, in _cursor
self.ensure_connection()
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangoutilsasyncio.py", line 26, in inner
return func(*args, **kwargs)
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangodbbackendsbasebase.py", line 243, in ensure_connection
with self.wrap_database_errors:
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangodbutils.py", line 91, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangodbbackendsbasebase.py", line 244, in ensure_connection
self.connect()
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangoutilsasyncio.py", line 26, in inner
return func(*args, **kwargs)
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangodbbackendsbasebase.py", line 225, in connect
self.connection = self.get_new_connection(conn_params)
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangoutilsasyncio.py", line 26, in inner
return func(*args, **kwargs)
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagesdjangodbbackendspostgresqlbase.py", line 203, in get_new_connection
connection = Database.connect(**conn_params)
File "C:Usersliam.obrienAppDataLocalpypoetryCachevirtualenvstdd-framework-FOYpVOaj-py3.10libsite-packagespsycopg2__init__.py", line 122, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
django.db.utils.OperationalError: connection to server at "127.0.0.1", port 5432 failed: FATAL:  password authentication failed for user "admin"

我完全不知道发生了什么,因为我的env文件和django项目中的settings.py文件的密码是一样的。

需要说明的是,我在docker中运行postgres容器,然后试图在主机上本地运行django测试服务器,并且在启动时抛出错误。

所以对于任何发现这一点的人来说,我得到了这个线程的巨大帮助;从外部连接到docker容器中的Postgresql

问题最终是由于某种原因,端口5432被使用,我认为是django自己(虽然如果有人知道真正的答案,知识将是非常感激),解决方案是改变端口映射到另一个端口,在我的情况下:

postgres:
ports:
- "6543:5432"

然后,您可以测试您是否可以通过以下uri从主机上的终端访问postgres db:

psql postgresql://<postgres_user_name>:<postgres_pass>@localhost:6543/postgres

我遇到的另一个问题是,要获得psql命令,您需要将postgres添加到系统环境变量路径中,如下所示:%PROGRAMFILES%/PostgreSQL/<postgres_version_num>/bin/

最新更新