我有一个构建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会遇到一些问题。
答案 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 = *
传递所有内容。