在测试中使用postgres图像

时间:2016-08-04 14:00:47

标签: postgresql docker docker-compose

给出以下docker-compose.test.yml文件:

version: '2'
services:
  sut:
    build: .
    command: nosetests
    environment:
      - DJANGO_SETTINGS_MODULE=test.settings
    links:
      - db
  db:
    image: postgres
    expose:
      - 5432

构建sut容器

docker-compose -f docker-compose.test.yml build sut

运行容器:

thomas@linuxclientlobnek01:~/github/djlobnek$ docker-compose -f docker-compose.test.yml run sut /bin/bash 
root@6694ec7148ac:/djlobnek# psql -h localhost -U postgres
psql: could not connect to server: Connection refused
    Is the server running on host "localhost" (::1) and accepting
    TCP/IP connections on port 5432?
**could not connect to server: Connection refused**
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?

1 个答案:

答案 0 :(得分:1)

在数据库准备好接受连接之前,您的应用程序可能正在尝试连接到数据库。如果是这种情况,那么在sut容器中实现某种等待数据库循环可以解决问题。我过去曾使用过类似的东西:

while ! psql -h db -U postgres postgres -c 'select 1'; do
  echo "waiting for database"
  sleep 1
done

如果您的应用程序知道如何重试不成功的数据库连接,那么这是不必要的。

在您尝试此操作之前,最好验证postgres容器是否实际正常运行(例如,输入带有sut的{​​{1}}容器并尝试使用{{手动连接1}})。

<强>更新

尝试从docker exec容器内部连接psql无法正常工作(postgres不会在该容器内运行)。您需要使用主机名localhost,否则您需要sut容器的IP地址。 E.g:

db

如果您db容器本身postgres -h db -U postgres postgres ,则可以使用localhost作为主机名。