我在容器中有一个Rails应用程序,我想使用像geminabox
或gemstash
这样的服务来代理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 app
(app
是服务名称)时,我的捆绑包失败了以下内容:
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
命令访问该服务?
答案 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