【问题标题】:could not translate host name "db" to address when running Django test in Docker through PyCharm通过 PyCharm 在 Docker 中运行 Django 测试时无法将主机名“db”转换为地址
【发布时间】: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 中运行测试时,应用程序容器似乎找不到数据库容器。这带来了两个问题:

  1. 有没有办法解决这个问题,以便应用程序容器可以找到数据库容器?我知道docker networking on localhost is tricky

  2. 是否可以设置测试以使它们不需要连接到数据库容器?我觉得 Djangopsycopg2 应该能够为测试启动一个模拟 PostgreSQL 服务。

我过去解决此问题的一种方法是use sqlite3 for my test database;但是,我正在使用与 sqlite 不兼容的字段(例如 ArrayField),所以这不是一个选项。

【问题讨论】:

标签: python django postgresql docker pycharm


【解决方案1】:

在你的 yml 文件中尝试更改

services:
  db:
    image: postgres:11

在你的 settings.py 中:

 DATABASES = {
        "default": {
            "ENGINE": "django.db.backends.postgresql_psycopg2",
            "NAME": "pycharm",
            "USER": "pycharm",
            "PASSWORD": "pw123",
            "HOST": "db",
            "PORT":5432,
        }
    }

【讨论】:

    【解决方案2】:

    每当我创建一个新的 pycharm/docker 项目时,这都会让我感到困惑。

    Pycharm 不知道 db 网络,您需要更改 pycharm 运行配置以在 pycharm 的运行配置中添加 db_default(或任何网络名称)作为 network_mode。

    run/debug config

    where the network mode value comes from the network you get from docker inspect db

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-16
      • 2021-08-25
      • 1970-01-01
      • 2021-10-03
      • 2019-01-15
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      相关资源
      最近更新 更多