因此,我有一个简单的Python Flask应用程序,其中有2个服务:应用程序和数据库。我希望应用程序(Flask应用程序)连接到数据库服务(PostgreSQL)。
现在,当我注释掉Application服务并运行时docker-compose up
,它将启动端口5432上公开的Database服务。然后当我在本地运行Flask应用并尝试连接时,它可以工作。
现在,我取消注释应用程序服务并运行docker-compose up --build
。它构建并启动这两个服务。但是当我访问http:// localhost:5000时,由于连接错误(拒绝),应用程序崩溃了。
version: '3.7'
services:
application:
depends_on:
- database
build: ./core
restart: always
networks:
- cbr-open-data
ports:
- 5000:5000
environment:
FLASK_ENV: development
volumes:
- ./core:/app
database:
image: postgres
restart: always
networks:
- cbr-open-data
environment:
POSTGRES_USER: ${DATABASE_USER}
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
POSTGRES_DB: ${DATABASE_NAME}
ports:
- 5432:5432
volumes:
- ./database:/var/lib/postgresql/data
networks:
cbr-open-data:
driver: bridge
import psycopg2
import pandas
connection = psycopg2.connect(
host = 'localhost',
database = '...',
user = '...',
password = '...',
port='5432'
)
users = pandas.read_sql('SELECT * FROM users', connection)
from flask import Flask, render_template
from config.connection import users
app = Flask(__name__)
@app.route('/')
def index():
print(users)
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
➜ cbr-open-data git:(master) ✗ docker-compose up
Creating network "cbr-open-data_cbr-open-data" with driver "bridge"
Creating cbr-open-data_database_1 ... done
Creating cbr-open-data_application_1 ... done
Attaching to cbr-open-data_database_1, cbr-open-data_application_1
application_1 | * Environment: development
application_1 | * Debug mode: on
application_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
application_1 | * Restarting with stat
application_1 | * Debugger is active!
application_1 | * Debugger PIN: 159-218-115
database_1 |
database_1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
database_1 |
database_1 | 2020-02-09 18:10:37.188 UTC [1] LOG: starting PostgreSQL 12.1 (Debian 12.1-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
database_1 | 2020-02-09 18:10:37.189 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
database_1 | 2020-02-09 18:10:37.189 UTC [1] LOG: listening on IPv6 address "::", port 5432
database_1 | 2020-02-09 18:10:37.192 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
database_1 | 2020-02-09 18:10:37.303 UTC [27] LOG: database system was shut down at 2020-02-09 13:21:34 UTC
database_1 | 2020-02-09 18:10:37.330 UTC [1] LOG: database system is ready to accept connections
THIS IS WHEN I VISIT THE FLASK APP ON 5000.
application_1 | 172.28.0.1 - - [09/Feb/2020 18:10:41] "GET / HTTP/1.1" 500 -
application_1 | Traceback (most recent call last):
application_1 | File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
application_1 | raise value
application_1 | File "/app/app.py", line 2, in <module>
application_1 | from config.connection import users
application_1 | File "/app/config/connection.py", line 9, in <module>
application_1 | port='5432'
application_1 | File "/usr/local/lib/python3.7/site-packages/psycopg2/__init__.py", line 126, in connect
application_1 | conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
application_1 | psycopg2.OperationalError: could not connect to server: Connection refused
application_1 | Is the server running on host "localhost" (127.0.0.1) and accepting
application_1 | TCP/IP connections on port 5432?
application_1 | could not connect to server: Cannot assign requested address
application_1 | Is the server running on host "localhost" (::1) and accepting
application_1 | TCP/IP connections on port 5432?
application_1 | 172.28.0.1 - - [09/Feb/2020 18:10:41] "GET /?__debugger__=yes&cmd=resource&f=style.css HTTP/1.1" 200 -
application_1 | 172.28.0.1 - - [09/Feb/2020 18:10:41] "GET /?__debugger__=yes&cmd=resource&f=debugger.js HTTP/1.1" 200 -
application_1 | 172.28.0.1 - - [09/Feb/2020 18:10:41] "GET /?__debugger__=yes&cmd=resource&f=jquery.js HTTP/1.1" 200 -
application_1 | 172.28.0.1 - - [09/Feb/2020 18:10:42] "GET /?__debugger__=yes&cmd=resource&f=ubuntu.ttf HTTP/1.1" 200 -
application_1 | 172.28.0.1 - - [09/Feb/2020 18:10:42] "GET /?__debugger__=yes&cmd=resource&f=console.png HTTP/1.1" 200 -
有人可以解释为什么我在本地运行应用程序时数据库服务拒绝来自应用程序服务的连接但接受连接吗?我想对未来的实践有个更好的理解。
link
是有可能的,但是docker不建议这样做,因为它可能会从将来的更新中删除。非常感谢所有帮助!提前致谢。
postgres容器未在上运行localhost
。localhost
应用容器是应用容器本身。
您需要使用docker网络上的postgres容器的IP(两个容器都属于该容器)。
您可以使用docker-compose内置DNS获取IP。只需替换:
connection = psycopg2.connect(
host = 'localhost',
database = '...',
user = '...',
password = '...',
port='5432'
)
带有:
connection = psycopg2.connect(
host = 'database',
database = '...',
user = '...',
password = '...',
port='5432'
)
database
撰写文件中的服务名称已通过撰写映射到容器IP。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句