无法使用docker和tox连接到Postgres服务

时间:2019-05-03 05:37:45

标签: python django docker tox

我有一个构建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会遇到一些问题。

2 个答案:

答案 0 :(得分:1)

这可能是由众所周知的事情引起的,即测试容器在DB容器完全运行之前就启动了。尽管您在Docker中设置了撰写依赖项/链接,但docker仅等待依赖容器启动。如果数据库初始化花费30秒,那么第二个容器将在此之前启动,您将看到此问题。

解决方案是在第二个容器中放置一些bash脚本,该脚本将对数据库端口执行ping操作,以使其等待数据库准备就绪。检查SO,还有多个类似的问题,提供了一些不错的解决方案,如何使第二个容器等待依赖的DB。

答案 1 :(得分:1)

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

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

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

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