【问题标题】:Unable to connect to Postgres service using docker and tox无法使用 docker 和 tox 连接到 Postgres 服务
【发布时间】:2019-05-03 05:37:45
【问题描述】:

我有一个构建 Postgres 数据库的 docker 应用程序。我正在使用 tox 运行我的 Django 测试。当我在本地机器上的 docker 映像上运行 docker-compose run web tox 时(我使用 docker-compose up --build --force-recreate -d 构建我的 docker 映像),它显示错误:

E       django.db.utils.OperationalError: could not connect to server:                     
        Connection refused
E       Is the server running on host "127.0.0.1" and accepting
E       TCP/IP connections on port 5432?

但是当我运行唯一的 tox 命令(不在我的 docker 映像上)时,它工作正常。

我尝试通过在我的 docker 映像上使用 docker-compose run web python manage.py test 来运行不带毒物的 Django 测试。在这种情况下,它没有显示任何错误。我想我在我的 docker 映像上运行 tox 时遇到了一些问题。

【问题讨论】:

  • 添加您的撰写文件和 python 数据库连接配置。

标签: python django docker tox


【解决方案1】:

这可能是由众所周知的事情引起的,即测试容器在 DB 容器完全正常运行之前启动。尽管您在 docker compose dependency/link 中进行了设置,但 docker 只等待依赖容器启动。如果数据库初始化需要 30 秒,那么第二个容器将在此之前启动,您将看到此问题。

解决方案是在第二个容器上放置一些 bash 脚本,该脚本将 ping 数据库端口,使其等待数据库准备好。检查 SO,有多个类似的问题以及一些很好的解决方案如何使第二个容器等待依赖数据库。

【讨论】:

    【解决方案2】:

    当数据库确实在运行时,我遇到了同样的问题。事实证明,除非您告诉 Tox,否则 Tox 不会将 env 变量从主机传递到测试环境,因此 Django 试图连接错误的数据库设置。

    修复方法是使用 Tox.ini 文件中的 passenv 选项来传递所需的变量:

    [testenv]
    deps = -r requirements.txt
    commands = pytest {posargs}
    passenv = POSTGRES_USER POSTGRES_PASSWORD POSTGRES_HOST POSTGRES_PORT
    

    您也可以使用passenv = * 传递所有内容。

    【讨论】:

      猜你喜欢
      • 2015-08-26
      • 2022-01-27
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 2012-11-04
      • 1970-01-01
      相关资源
      最近更新 更多