Python docker与sql转储中的多个postgres数据库组合

Python docker与sql转储中的多个postgres数据库组合,python,postgresql,docker,docker-compose,dockerfile,Python,Postgresql,Docker,Docker Compose,Dockerfile,我知道这可能看起来像是一个复制品,但我仍然无法设法让它工作后,通过的答案 这是我的docker compose.yml: version: '3' services: backend: image: backend:1.0 build: ./backend ports: - "9090:9090" depends_on: - db - ppt environment: - DATABASE_HOST=db

我知道这可能看起来像是一个复制品,但我仍然无法设法让它工作后,通过的答案

这是我的
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上有一个db,在端口5432上有另一个db。但是,当我在启动容器后运行
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 DockerFile基本相同:

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上运行的任何内容。如何使db容器端口5432对后端容器可见?

两台计算机上的postgres进程都侦听5432,因为这是默认行为。仅通过公开,您不会改变这一点,这只是意味着容器公开端口5433而不是5432。但是在这个端口上没有进程在侦听。 尝试更改以下内容:

FROM postgres:9.6.3
ENV POSTGRES_USER ludo
ENV POSTGRES_PASSWORD password
ENV POSTGRES_DB login
EXPOSE 5432
ADD db_dump.sql /docker-entrypoint-initdb.d
然后更改docker compose,如下所示:

login_db:
    image: login_db:27.04.2018
    restart: always
    build: ./login_db
    ports:
      - "5433:5432"

现在,您可以通过5432(从主机)访问“db”,通过5433(从主机)访问“login_db”。注意,您仍然需要使用5432从另一个容器访问一个dbs

更新

经过多次摆弄,我使它开始工作了。正如@Iarwa1n所建议的,将一个db映射为
“5432:5432”
,另一个映射为
“5433:5432”
。我遇到的错误是因为我是如何从应用程序本身调用postgres的。重要的是要认识到postgres主机不再是本地主机,而是在docker-compose.yaml中为数据库服务指定的名称。就我而言
db
用于
后端
login\u db
用于
login
服务。此外,我不得不将我的驱动程序从
postgresql
更改为
postgres
——不知道这是为什么

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

postgres://ludo:password@数据库:5432/main_数据库

定义如下:

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) 如果您正在使用请求python库(就像我一样),那么请确保适当地更改url。例如,我通过请求库调用了一个ppt服务,我必须将url更改为:
'http://ppt:6060/api/getPpt“
而不是
”http://localhost:6060/api/getPpt“

因此,在我的后端应用程序和登录应用程序(都停靠在各自的容器中)的数据库配置中,我仍然需要将端口设置为5432:
数据库配置={'driver':'postgresql','host':'localhost','user':'ludo','password':'password','port':5432}
?在做出您建议的更改后,我仍然会收到相同的错误。容器正在运行,端口5432从容器映射到主机
0.0.0:5432->5432/tcp
,我的应用程序在查询数据库时正在调用该端口,但它仍然无法建立连接。。。