ruby-on-rails – 如何在Travis CI上获得Docker主机IP?

我在特拉维斯有一个Rails回购.它有一个docker-compose.yml文件:

postgres:
  image: postgres
  ports:
    - "5433:5432"
  environment:
    - POSTGRES_USER=calories
    - POSTGRES_PASSWORD=secretpassword

(我不得不使用5433作为主机端口,因为5432给了我一个错误:启动userland代理时出错:listen tcp 0.0.0.0:5432:bind:地址已在使用中)

还有一个travis.yml:

sudo: required

services:
  - docker
language: ruby
cache: bundler
before_install:
  # Install docker-compose
  - curl -L https://github.com/docker/compose/releases/download/1.4.0/docker-compose-`uname -s`-`uname -m` > docker-compose
  - chmod +x docker-compose
  - sudo mv docker-compose /usr/local/bin
  # TODO: Remove this temporary fix when it's safe to:
  # https://github.com/travis-ci/travis-ci/issues/4778
  - sudo iptables -N DOCKER || true
  - sleep 10
  - docker-compose up -d
before_script:
  - bundle exec rake db:setup
script:
  - bundle exec rspec spec
after_script:
  - docker-compose stop
  - docker-compose rm -f

我试图找出放在我的database.yml中的内容,以便我的测试可以在Travis CI上运行.在我的其他环境中,我可以这样做:

adapter: postgresql
encoding: unicode
host:  <%= `docker-machine ip default` %>
port: 5433
username: calories
password: secretpassword
# For details on connection pooling, see rails configuration guide
# http://guides.rubyonrails.org/configuring.html#database-pooling
pool: 5

但不幸的是,这对Travis不起作用,因为Travis上没有码头机.我收到一个错误:docker-machine:找不到命令

如何在Travis上获取Docker主机的IP?

最佳答案 我想你想要的实际上是容器IP,而不是docker引擎IP.在桌面上,您必须向docker-machine查询IP,因为创建的VM docker-machine没有转发端口.

由于您正在公开主机端口,因此您实际上可以使用localhost作为主机值.

还有两个选项:

>在容器中运行测试并链接到数据库容器,这样您就可以使用postgres作为主机值.
>如果您不想使用主机端口,可以使用https://github.com/swipely/docker-api(或其他一些ruby客户端)查询docker API以获取容器IP,并将其用于主机值.查找inspect或inspect容器API调用.

点赞