连接到Docker容器上的PostgreSQL数据库
我想在不同的Docker容器上运行一个PostgreSQL数据库和一个由Django支持的REST API的应用程序。 到目前为止,API已经在连接到SQLite数据库的Docker上运行,但是现在我遇到了麻烦,我想连接到PostgreSQL数据库。
Docker的docker-compose.yml
文件:
version: '2' services: postgres: image: postgres api: build: . command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:1337" volumes: - .:/usr/src/app ports: - "1337:1337" depends_on: - postgres
Django的settings.py
(根据文档使用基本postgres
映像的默认设置):
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'wgomanager', 'USER': 'postgres', 'PASSWORD': 'mysecretpassword', 'HOST': 'localhost', 'PORT': '5432', } }
当我用docker-compose up
启动应用程序docker-compose up
最终引发这个错误:
api_1 | connection = Database.connect(**conn_params) api_1 | File "/usr/local/lib/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect api_1 | conn = _connect(dsn, connection_factory=connection_factory, **kwasync) api_1 | django.db.utils.OperationalError: could not connect to server: Connection refused api_1 | Is the server running on host "localhost" (::1) and accepting api_1 | TCP/IP connections on port 5432? api_1 | could not connect to server: Connection refused api_1 | Is the server running on host "localhost" (127.0.0.1) and accepting api_1 | TCP/IP connections on port 5432? api_1 | orchestrator_api_1 exited with code 1
我究竟做错了什么?
当使用docker-compose时,通过主机名“发现”服务。 您的数据库服务使用标签postgres定义。 将其用作应用程序configuration中的主机名。
密码和数据库名称也必须与您的应用程序configuration同步。 这是通过postgres服务的环境variables完成的:
services: postgres: environment: - POSTGRES_PASSWORD: "mysecretpassword" - POSTGRES_DB: "wgomanager" # rest of docker-compose.yml
请参考关于各种环境的文档 。 variables影响服务configuration。