【发布时间】:2020-04-07 21:39:17
【问题描述】:
我有一个带有 PostgreSQL 后端的简单 Django 项目:
version: '3'
services:
db:
image: postgres:12
ports:
- '5432:5432'
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
POSTGRES_USER: pycharm
POSTGRES_PASSWORD: pw123
POSTGRES_DB: pycharm
app:
build: .
command: python manage.py runserver 0.0.0.0:8000
ports:
- '8000:8000'
volumes:
- .:/app
depends_on:
- db
volumes:
postgres_data:
在settings.py 中使用以下数据库设置:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": "pycharm",
"USER": "pycharm",
"PASSWORD": "pw123",
"HOST": "db",
}
}
还有一个简单的测试:
from django.test import TestCase
class MyTestCase(TestCase):
def test_example(self):
assert 1 == 1
当我使用 docker-compose 运行项目时一切正常:
docker-compose up
我可以exec进入运行django应用的容器并成功执行测试:
docker-compose run app bash
$ python manage.py test demo.tests.MyTestCase
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.002s
OK
Destroying test database for alias 'default'...
我想在 PyCharm 中运行测试,而不是每次都执行到容器中。我已经使用 Docker 设置了远程解释器。但是,当我在 PyCharm 中运行测试时,出现以下错误:
django.db.utils.OperationalError:无法将主机名“db”转换为地址:名称或服务未知
当我在 PyCharm 中运行测试时,应用程序容器似乎找不到数据库容器。这带来了两个问题:
有没有办法解决这个问题,以便应用程序容器可以找到数据库容器?我知道docker networking on localhost is tricky。
是否可以设置测试以使它们不需要连接到数据库容器?我觉得
Django或psycopg2应该能够为测试启动一个模拟 PostgreSQL 服务。
我过去解决此问题的一种方法是use sqlite3 for my test database;但是,我正在使用与 sqlite 不兼容的字段(例如 ArrayField),所以这不是一个选项。
【问题讨论】:
-
将
hostname: db添加到数据库容器规范中? -
@richyen 不幸遇到同样的错误
-
这能回答你的问题吗? Django docker - could not translate host name "db" to address: nodename nor servname provided, or not known -- 也许你需要
linkindocker-compose? -
你需要在 settings.py 上的配置中设置端口并尝试使用 postgres 11
标签: python django postgresql docker pycharm