Docker无法与Travis CI中的postgresqlbuild立连接

我正在尝试将Travis CI集成到我的Rails应用程序中。 一切工作正常我的本地机器(Ubuntu的,Windows),但在Travis主机有一个连接错误。 所以,这是我的configuration。

.travis.yml

 sudo: required language: ruby services: - docker env: DOCKER_COMPOSE_VERSION: 1.13.0 before_install: - sudo rm /usr/local/bin/docker-compose - curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose - chmod +x docker-compose - sudo mv docker-compose /usr/local/bin - sudo apt-get update - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-engine - docker-compose build - docker-compose -f docker-compose.commands.yml run --rm website rails db:create db:migrate db:test:prepare script: - docker-compose -f docker-compose.commands.yml run --rm -e RAILS_ENV=test website rspec 

database.yml

 development: &default adapter: postgresql database: my_app_development username: postgres host: postgres port: 5432 

docker-compose.commands.yml

 version: '3' services: postgres: image: 'postgres:9.6.2' ports: - "5432" website: depends_on: - 'postgres' build: . ports: - '3000' volumes: - '.:/my_app' - 'bundle_data:/bundle' volumes: bundle_data: 

但是Travis日志在运行迁移时输出

状态:为postgres下载更新的图像:9.6.2

创buildmyapp_postgres_1 …

创buildmyapp_postgres_1

无法连接到服务器:连接被拒绝服务器运行在主机“postgres”(172.18.0.2)上,并接受端口5432上的TCP / IP连接? 无法为{“adapter”=>“postgresql”,“encoding”=>“unicode”,“database”=>“my_app_development”,“pool”=> 5,“username”=>“postgres”创build数据库。 “host”=>“postgres”,“port”=> 5432} rails中止! PG :: ConnectionBad:无法连接到服务器:连接被拒绝服务器上运行主机“postgres”(172.18.0.2),并接受端口5432上的TCP / IP连接?

感谢@ johnharris85和@jbielick我find了这个解决scheme:

 website: depends_on: - 'postgres' build: . ports: - '3000' volumes: - '.:/my_app' - 'bundle_data:/bundle' entrypoint: ./wait-for-postgres.sh postgres 5432 postgres: image: 'postgres:9.6.2' ports: - '5432' 

wait-for-postgres.sh

 #!/bin/sh postgres_host=$1 postgres_port=$2 shift 2 cmd="$@" # wait for the postgres docker to be running while ! pg_isready -h $postgres_host -p $postgres_port -q -U postgres; do >&2 echo "Postgres is unavailable - sleeping" sleep 1 done >&2 echo "Postgres is up - executing command" # run the command exec $cmd