【问题标题】:How to get Docker host IP on Travis CI?如何在 Travis CI 上获取 Docker 主机 IP?
【发布时间】:2017-08-13 21:51:18
【问题描述】:

我有一个关于 Travis 的 Rails 存储库。它有一个 docker-compose.yml 文件:

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

(我不得不使用 5433 作为主机端口,因为 5432 给了我一个错误:Error starting userland proxy: listen tcp 0.0.0.0:5432: bind: address already in use

还有一个 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?

【问题讨论】:

  • 您是否尝试在script.travis.yml 文件中添加- docker ps?它应该显示所有正在运行的容器;)

标签: ruby-on-rails docker chef-infra travis-ci


【解决方案1】:

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

由于您要公开主机端口,因此您实际上可以使用 localhost 作为 host 值。

还有其他两个选项:

  • 在容器中运行测试并链接到数据库容器,因此您可以将postgres 用作host 值。
  • 如果您不想使用主机端口,您可以使用https://github.com/swipely/docker-api(或其他一些 ruby​​ 客户端)查询容器 IP 的 docker API,并将其用于host 值。查找检查或检查容器 API 调用。

【讨论】:

  • 感谢您为我指出一些可能的方向。我尝试了容器 IP、容器网关 IP 和 localhost,但不幸的是它们都不起作用。有什么想法我还能尝试吗?
  • 不幸的是,我的团队不能在容器中运行测试
  • 你能解决问题吗?我有完全相同的问题。
  • 我也是。我正在使用 docker-compose 1.7.1 和 docker engine 1.11.1-0~trusty (安装在我的 before_install 脚本中)。 @Sandy 运气好吗?
【解决方案2】:

对于遇到这种情况的其他人,您应该能够通过运行获取主机 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 吗?

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    相关资源
    最近更新 更多