在运行``loader-compose build app`时,`连接拒绝`到本地容器

时间:2018-02-23 15:04:54

标签: docker docker-compose

我在容器中有一个Rails应用程序,我想使用像geminaboxgemstash这样的服务来代理https://rubygems.org并使用更快的bundle install命令。

我已经启动了一个gemstash容器,在我的主机上发布端口9292并使用curl我可以访问该服务。

在我的Rails应用程序的Dockerfile中,我在bundle install之前添加了以下行:

RUN bundle config mirror.https://rubygems.org http://localhost:9292

当我运行docker-compose build appapp是服务名称)时,我的捆绑包失败了以下内容:

Errno::EADDRNOTAVAIL: Cannot assign requested address - connect(2) for "localhost" port 9292
  /usr/local/lib/ruby/2.2.0/net/http.rb:879:in `initialize'
  /usr/local/lib/ruby/2.2.0/net/http.rb:879:in `open'
  /usr/local/lib/ruby/2.2.0/net/http.rb:879:in `block in connect'
  /usr/local/lib/ruby/2.2.0/timeout.rb:88:in `block in timeout'
  /usr/local/lib/ruby/2.2.0/timeout.rb:98:in `call'
  /usr/local/lib/ruby/2.2.0/timeout.rb:98:in `timeout'
  /usr/local/lib/ruby/2.2.0/net/http.rb:878:in `connect'
  /usr/local/lib/ruby/2.2.0/net/http.rb:863:in `do_start'
  /usr/local/lib/ruby/2.2.0/net/http.rb:858:in `start'
  /usr/local/bundle/gems/bundler-1.16.1/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb:702:in `start'
  /usr/local/bundle/gems/bundler-1.16.1/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb:633:in `connection_for'
  /usr/local/bundle/gems/bundler-1.16.1/lib/bundler/vendored_persistent.rb:23:in `connection_for'
  /usr/local/bundle/gems/bundler-1.16.1/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb:996:in `request'
  /usr/local/bundle/gems/bundler-1.16.1/lib/bundler/fetcher/downloader.rb:51:in `request'
  /usr/local/bundle/gems/bundler-1.16.1/lib/bundler/fetcher/downloader.rb:17:in `fetch'
  /usr/local/bundle/gems/bundler-1.16.1/lib/bundler/fetcher/compact_index.rb:117:in `call'
  /usr/local/bundle/gems/bundler-1.16.1/lib/bundler/compact_index_client/updater.rb:51:in `block in update'
  /usr/local/lib/ruby/2.2.0/tmpdir.rb:88:in `mktmpdir'
  /usr/local/bundle/gems/bundler-1.16.1/lib/bundler/compact_index_client/updater.rb:31:in `update'
...

我还尝试使用--network host启动gemstash容器以删除网络隔离,但即使主机上的curl命令也被拒绝。

如何从docker-compose build命令访问该服务?

1 个答案:

答案 0 :(得分:0)

Docker默认在默认桥接网络中构建映像。我们可以使用docker build --network <network>进行更改,但不能使用docker-compose build进行更改。 Compose尚未支持此功能。因此,在映像构建期间访问gemstash容器的唯一方法是使用--network host类型启动它,并通过主机的IP地址访问它。

1。 docker-compose.yaml类似于:

version: '3'
services:
  gemstash:
    image: <gemstash_image>
    network_mode: "host"

  rails_app:
    build:
      context: .
      args:
        IP_ADDRESS: ${IP_ADDRESS}  

2。 gemstash容器启动后:

docker-compose up -d gemstash

我们看到它可以在主机的IP上访问:

netstat -nlpt | grep 9292
tcp        0      0 0.0.0.0:9292            0.0.0.0:*               LISTEN      -       

3. Dockerfile被修改为:

ARG IP_ADDRESS
RUN bundle config mirror.https://rubygems.org http://$IP_ADDRESS:9292

其中IP_ADDRESS是主机的IP地址。

4. IP_ADDRESS变量注入docker-compose.yaml。为此,我们创建.env文件并在那里定义我们的变量(例如,对于linux主机):

IP_ADDRESS=$(ip a | grep <interface> | grep inet | awk '{print $2}' | awk -F'/' '{print $1}')
echo "IP_ADDRESS=$IP_ADDRESS" > .env

5. 现在我们可以构建rails_app,它可以到达gemstash容器:

docker-compose build