gpt4 book ai didi

python - docker-compose 与来自 sql 转储的多个 postgres 数据库

转载 作者:行者123 更新时间:2023-11-28 22:19:03 24 4
gpt4 key购买 nike

我知道这看起来像是 docker-compose with multiple databases 的副本,但在看完答案后我仍然无法让它工作。

这是我的docker-compose.yml:

version: '3'
services:
backend:
image: backend:1.0
build: ./backend
ports:
- "9090:9090"
depends_on:
- db
- ppt
environment:
- DATABASE_HOST=db
db:
image: main_db:26.03.18
restart: always
build: ./db
ports:
- "5432:5432"
ppt:
image: ppt_generator:1.0
build: ./ppt
ports:
- "6060:6060"
login:
image: login:1.0
build: ./login
ports:
- "7070:7070"
depends_on:
- login_db
login_db:
image: login_db:27.04.2018
restart: always
build: ./login_db
ports:
- "5433:5433"

请注意,我在端口 5433 上有一个数据库,另一个在端口 5432 上。但是,当我在启动容器后运行 docker ps 时,我得到以下信息。我不完全了解端口的情况。

CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS                              NAMES
997f816ddff3 backend:1.0 "/bin/sh -c 'pytho..." About a minute ago Up About a minute 0.0.0.0:9090->9090/tcp backendservices_backend_1
759546109a66 login:1.0 "/bin/sh -c 'pytho..." About a minute ago Up About a minute 0.0.0.0:7070->7070/tcp, 9090/tcp backendservices_login_1
a2a26b72dd0c login_db:27.04.2018 "docker-entrypoint..." About a minute ago Up About a minute 5432/tcp, 0.0.0.0:5433->5433/tcp backendservices_login_db_1
3f97de7fc41e main_db:26.03.18 "docker-entrypoint..." About a minute ago Up About a minute 0.0.0.0:5432->5432/tcp backendservices_db_1
1a61e741ccba ppt_generator:1.0 "/bin/sh -c 'pytho..." About a minute ago Up About a minute 0.0.0.0:6060->6060/tcp backendservices_ppt_1

除了我公开的端口号外,我的两个 db dockerfiles 基本相同:

FROM postgres:9.6.3
ENV POSTGRES_USER ludo
ENV POSTGRES_PASSWORD password
ENV POSTGRES_DB login
EXPOSE 5433

ADD db_dump.sql /docker-entrypoint-initdb.d

这是我得到的错误:

backend_1   | Traceback (most recent call last):
backend_1 | File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2147, in _wrap_pool_connect
backend_1 | return fn()
backend_1 | File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 387, in connect
backend_1 | return _ConnectionFairy._checkout(self)
backend_1 | File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 766, in _checkout
backend_1 | fairy = _ConnectionRecord.checkout(pool)
backend_1 | File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 516, in checkout
backend_1 | rec = pool._do_get()
backend_1 | File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 1138, in _do_get
backend_1 | self._dec_overflow()
backend_1 | File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__
backend_1 | compat.reraise(exc_type, exc_value, exc_tb)
backend_1 | File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 187, in reraise
backend_1 | raise value
backend_1 | File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 1135, in _do_get
backend_1 | return self._create_connection()
backend_1 | File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 333, in _create_connection
backend_1 | return _ConnectionRecord(self)
backend_1 | File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 461, in __init__
backend_1 | self.__connect(first_connect_check=True)
backend_1 | File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 651, in __connect
backend_1 | connection = pool._invoke_creator(self)
backend_1 | File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 105, in connect
backend_1 | return dialect.connect(*cargs, **cparams)
backend_1 | File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 393, in connect
backend_1 | return self.dbapi.connect(*cargs, **cparams)
backend_1 | File "/usr/local/lib/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect
backend_1 | conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
backend_1 | psycopg2.OperationalError: could not connect to server: Connection refused
backend_1 | Is the server running on host "localhost" (127.0.0.1) and accepting
backend_1 | TCP/IP connections on port 5432?
backend_1 | could not connect to server: Cannot assign requested address
backend_1 | Is the server running on host "localhost" (::1) and accepting
backend_1 | TCP/IP connections on port 5432?
backend_1 |

为什么数据库没有在端口 5432 上运行?它曾经在我只有一个数据库时工作,现在有两个它似乎很困惑......?

更新我可以在本地分别通过端口 5432 和 5433 访问数据库。但是,从我的后端容器我不能。我的后端容器似乎没有接收到在端口 5432 上运行的任何内容。如何使后端容器可以看到数据库容器端口 5432?

最佳答案

更新

经过大量摆弄后,我让它开始工作。正如@Iarwa1n 建议的那样,您将一个数据库映射为“5432:5432”,将另一个数据库映射为“5433:5432”。我遇到的错误是由于我是如何从应用程序本身调用 postgres 的。重要的是要意识到 postgres 主机不再是本地主机,而是您在 docker-compose.yaml 中为数据库服务指定的任何名称。就我而言; db 用于 backendlogin_db 用于 login 服务。此外,我不得不将我的驱动程序从 postgresql 更改为 postgres – 不知道这是为什么......

因此,我的 db_url 在我的 python 后端应用程序中最终看起来像这样:

postgres://ludo:password@db:5432/main_db

并以这种方式定义:

DATABASE_CONFIG = {
'driver': 'postgres',
'host': 'db',
'user': 'ludo',
'password': 'password',
'port': 5432,
'dbname': main_db
}
db_url = '{driver}://{user}:{password}@{host}:{port}/{dbname}'.format(database_config)

需要注意两点:

1) 无论您如何映射端口,您始终必须从应用程序内连接到 postgres 默认端口 5432

2) 如果您正在使用 requests python 库(就像我一样),那么请确保也适本地更改 url。例如,我有一个通过请求库调用的 ppt 服务,我不得不将 url 更改为:'http://ppt:6060/api/getPpt' 而不是 'http://localhost:6060/api/getPpt'

关于python - docker-compose 与来自 sql 转储的多个 postgres 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50084539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com