今晚我一直在为此苦苦挣扎。
我有一个docker compose文件,其中包含一些服务,RabbitMQ和一些发送器/接收器测试服务。
我已经将docker-compose.yml
文件剥离了很基本,所以它只是RabbitMQ和一项测试服务,但是我仍然遇到同样的问题:测试服务无法自动连接到网络,因此测试服务失败。我尝试在撰写文件中手动指定网络,但这似乎无济于事。一旦启动,它就会失败并显示错误。
奇怪的是,如果我先运行docker network connect <networkname> <containerID>
,然后再运行docker container start <containerID>
,它将加入网络并按预期运行。
这是我的docker-compose.yml
:
version: '3'
services:
sender:
image: sender_test
depends_on:
- some-rabbit
volumes:
- /var/log/sender
some-rabbit:
image: rabbitmq:3
hostname: some-rabbit
ports:
- 5672:5672
以及在sender
容器的日志中得到的错误:
/usr/local/bundle/gems/bunny-2.13.0/lib/bunny/session.rb:333:in `rescue in start': Could not establish TCP connection to any of the configured hosts (Bunny::TCPConnectionFailedForAllHosts)
from /usr/local/bundle/gems/bunny-2.13.0/lib/bunny/session.rb:305:in `start'
from ./sender.rb:23:in `initialize'
from ./sender.rb:83:in `new'
from ./sender.rb:83:in `<main>'
W, [2018-12-29T04:00:53.179458 #1] WARN -- #<Bunny::Session:0x55e4c3ae45b8 guest@some-rabbit:5672, vhost=/, addresses=[some-rabbit:5672]>: Could not establish TCP connection to some-rabbit:5672: Connection refused - connect(2) for 172.24.0.2:5672
有人有什么想法会出问题吗?很高兴根据需要提供任何进一步的信息。
编辑:由于显然可以在其他系统上使用,因此将在此处发布文件的内容:
sender.rb
:
#!/usr/bin/env ruby
require 'bunny'
class QueueAdder
def initialize
@connection = Bunny.new(host: 'some-rabbit', automatically_recover: false)
@connection.start
@channel = @connection.create_channel
end
def start(queue_name)
@queue_name = queue_name
@queue = @channel.queue(queue_name, durable: true)
@exchange = @channel.default_exchange
end
def add_to_queue(message)
@channel.default_exchange.publish(message, routing_key: @queue.name, persistent: true)
end
end
add = QueueAdder.new
add.start('test')
6.times do |i|
add.add_to_queue(i.to_s)
#puts "#{i+5}"
puts 'a'
sleep 1
end
Dockerfile
:
FROM ruby:2.5.1
RUN apt-get update
RUN dpkg --configure -a
ENV TZ=Europe/London
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN gem install pry bunny
WORKDIR /home/
COPY . .
CMD ["ruby", "./sender.rb"]
我正在使用docker image build -t sender_test .
构建映像,并使用docker-compose up -d
启动docker-compose。
答案 0 :(得分:0)
depends_on
参数仅告诉compose您sender_test容器依赖于另一个(即,它需要在其后旋转)
但它不链接容器。
要链接容器,您需要使用link
参数
尝试:
version: '3'
services:
sender:
image: sender_test
depends_on:
- some-rabbit
volumes:
- /var/log/sender
links:
- some-rabbit
some-rabbit:
image: rabbitmq:3
hostname: some-rabbit
ports:
- 5672:5672
顺便说一句,在您的Rabbit容器中,您也将端口暴露给了主机,而这可能并不需要(例如,将- 5672:5672
替换为- 5672
),以便仅将容器暴露给主机。另一个容器,但不在外面。
编辑:
更有可能的是,发件人代码没有等待服务启动并准备好接收连接,而不是网络问题