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

4

我有一个在Travis上的Rails代码库。它包含一个docker-compose.yml文件:

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

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

还有一个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。我收到一个错误:docker-machine: command not found

我怎样在Travis上获取Docker主机的IP地址呢?


你尝试在 .travis.yml 文件的 script 中添加 - docker ps 吗?这样应该会显示所有正在运行的容器 ;) - pplonski
2个回答

2
我认为你想要的实际上是容器IP,而不是Docker引擎IP。在桌面上,您必须查询 docker-machine 以获取IP地址,因为VM Docker-machine创建的未转发端口。
由于您正在暴露主机端口,因此实际上可以使用 localhost 作为 host 值。
还有另外两个选择:
  • 在容器中运行测试并链接到数据库容器,因此可以将 postgres 用作 host 值。
  • 如果您不想使用主机端口,则可以使用 https://github.com/swipely/docker-api (或其他Ruby客户端)来查询容器IP的Docker API,并将其用于 host 值。查找inspect或inspect container API调用。

谢谢你指引我一些可能的方向。我尝试了容器IP、容器网关IP和本地主机,但不幸的是它们都没有起作用。你有什么其他的想法吗? - Sandy
很遗憾,对于我的团队来说,在容器中运行测试不是一个选择。 - Sandy
你能解决这个问题吗?我也遇到了完全相同的问题。 - bengro
我也是。我正在使用docker-compose 1.7.1和docker engine 1.11.1-0〜trusty(安装在我的before_install脚本中)。@Sandy有什么运气? - erikdstock

0

对于其他人来说,你应该能够通过运行以下命令获取主机IP

export HOST_IP_ADDRESS="$(/sbin/ip route|awk '/default/ { print $3 }')"

从容器内部。然后,您可以通过脚本编辑数据库配置以插入它 - 它将在$HOST_IP_ADDRESS变量中。

但是,就像dnephin所说,我不确定这是否是您想要的。如果您正在运行Travis的Postgres服务并需要从容器内部访问它(取决于它们绑定到哪个IP地址),则可能会起作用。

但是,看起来您正在以相反的方式运行它,在这种情况下,我相当确定localhost应该可以让您到达那里。您可能需要尝试一些其他调试步骤,以确保容器已启动并准备就绪等。

编辑:如果localhost绝对不起作用,您尝试过127.0.0.1吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接