Python socket.error:超时(芹菜和RabbitMQ在docker容器中运行)

Python socket.error:超时(芹菜和RabbitMQ在docker容器中运行),python,docker,rabbitmq,celery,amqp,Python,Docker,Rabbitmq,Celery,Amqp,试图用正式的码头集装箱运货 docker run -d --hostname my-rabbit --name some-rabbit rabbitmq docker run --link some-rabbit:rabbit --name some-celery -d celery 我检查了日志以确保一切正常: # docker logs some-celery [2016-10-20 11:05:50,357: WARNING/MainProcess] /usr/local/lib/py

试图用正式的码头集装箱运货

docker run -d --hostname my-rabbit --name some-rabbit rabbitmq
docker run --link some-rabbit:rabbit --name some-celery -d celery
我检查了日志以确保一切正常:

# docker logs some-celery

[2016-10-20 11:05:50,357: WARNING/MainProcess] /usr/local/lib/python3.5/site-packages/celery/apps/worker.py:161: CDeprecationWarning:
Starting from version 3.2 Celery will refuse to accept pickle by default.

The pickle serializer is a security concern as it may give attackers
the ability to execute any command.  It's important to secure
your broker from unauthorized access when using pickle, so we think
that enabling pickle should require a deliberate action and not be
the default choice.

If you depend on pickle then you should set a setting to disable this
warning and to be sure that everything will continue working
when you upgrade to Celery 3.2::

    CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']

You must only enable the serializers that you will actually use.


  warnings.warn(CDeprecationWarning(W_PICKLE_DEPRECATED))
[2016-10-20 11:05:50,419: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@rabbit:5672//: [Errno 111] Connection refused.
Trying again in 2.00 seconds...

[2016-10-20 11:05:52,430: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@rabbit:5672//: [Errno 111] Connection refused.
Trying again in 4.00 seconds...

[2016-10-20 11:05:57,611: WARNING/MainProcess] celery@93b7b6c0b40b ready.
现在,在主机中,我使用的是
tasks.py

from celery import Celery

app = Celery('tasks', backend='amqp', broker='amqp://guest:guest@172.17.0.2/')

@app.task(name='tasks.add')
def add(x, y):
    return x + y
从主机命令行运行python并获得:

>>> from tasks import add
>>> res=add.delay(4,4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/celery/app/task.py", line 461, in delay
    return self.apply_async(args, kwargs)
  File "/Library/Python/2.7/site-packages/celery/app/task.py", line 573, in apply_async
    **dict(self._get_exec_options(), **options)
  File "/Library/Python/2.7/site-packages/celery/app/base.py", line 354, in send_task
    reply_to=reply_to or self.oid, **options
  File "/Library/Python/2.7/site-packages/celery/app/amqp.py", line 310, in publish_task
    **kwargs
  File "/Library/Python/2.7/site-packages/kombu/messaging.py", line 172, in publish
    routing_key, mandatory, immediate, exchange, declare)
  File "/Library/Python/2.7/site-packages/kombu/connection.py", line 470, in _ensured
    interval_max)
  File "/Library/Python/2.7/site-packages/kombu/connection.py", line 382, in ensure_connection
    interval_start, interval_step, interval_max, callback)
  File "/Library/Python/2.7/site-packages/kombu/utils/__init__.py", line 246, in retry_over_time
    return fun(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/kombu/connection.py", line 250, in connect
    return self.connection
  File "/Library/Python/2.7/site-packages/kombu/connection.py", line 756, in connection
    self._connection = self._establish_connection()
  File "/Library/Python/2.7/site-packages/kombu/connection.py", line 711, in _establish_connection
    conn = self.transport.establish_connection()
  File "/Library/Python/2.7/site-packages/kombu/transport/pyamqp.py", line 116, in establish_connection
    conn = self.Connection(**opts)
  File "/Library/Python/2.7/site-packages/amqp/connection.py", line 165, in __init__
    self.transport = self.Transport(host, connect_timeout, ssl)
  File "/Library/Python/2.7/site-packages/amqp/connection.py", line 186, in Transport
    return create_transport(host, connect_timeout, ssl)
  File "/Library/Python/2.7/site-packages/amqp/transport.py", line 299, in create_transport
    return TCPTransport(host, connect_timeout)
  File "/Library/Python/2.7/site-packages/amqp/transport.py", line 95, in __init__
    raise socket.error(last_err)
socket.error: timed out
>>从任务导入添加
>>>res=增加延迟(4,4)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Library/Python/2.7/site packages/芹菜/app/task.py”,第461行,延迟
返回self.apply\u async(args、kwargs)
文件“/Library/Python/2.7/site packages/celery/app/task.py”,第573行,在apply\u async中
**dict(self.\u get\u exec\u options(),**选项)
文件“/Library/Python/2.7/site packages/芹菜/app/base.py”,第354行,在发送任务中
reply\u to=reply\u to或self.oid,**选项
文件“/Library/Python/2.7/site packages/芹菜/app/amqp.py”,第310行,在发布任务中
**夸尔斯
文件“/Library/Python/2.7/site packages/kombu/messaging.py”,第172行,在publish中
路由(U密钥,强制,立即,交换,声明)
文件“/Library/Python/2.7/site packages/kombu/connection.py”,第470行,在
间隔(最大值)
文件“/Library/Python/2.7/site packages/kombu/connection.py”,第382行,在确保连接中
间隔\u开始、间隔\u步骤、间隔\u最大值、回调)
文件“/Library/Python/2.7/site packages/kombu/utils/_init__.py”,第246行,随时间重试
返回乐趣(*args,**kwargs)
文件“/Library/Python/2.7/site packages/kombu/connection.py”,第250行,在connect中
返回自连接
文件“/Library/Python/2.7/site packages/kombu/connection.py”,第756行,连接中
self.\u连接=self.\u建立连接()
文件“/Library/Python/2.7/site packages/kombu/connection.py”,第711行,在建立连接中
conn=self.transport.building_connection()
文件“/Library/Python/2.7/site packages/kombu/transport/pyamqp.py”,第116行,在建立连接中
conn=自连接(**选项)
文件“/Library/Python/2.7/site packages/amqp/connection.py”,第165行,在__
self.transport=self.transport(主机、连接超时、ssl)
文件“/Library/Python/2.7/site packages/amqp/connection.py”,第186行,在传输中
返回创建传输(主机、连接超时、ssl)
文件“/Library/Python/2.7/site packages/amqp/transport.py”,第299行,在create_transport中
返回TCPTTransport(主机,连接超时)
文件“/Library/Python/2.7/site packages/amqp/transport.py”,第95行,在__
提升套接字。错误(上次错误)
socket.error:超时
我看到了这一点,但这里的错误似乎有所不同

编辑: 我添加了RabbitMQ容器日志(相关部分):

docker记录了一些兔子的日志
RabbitMQ 3.6.5。版权所有(C)2007-2016 Pivotal Software,Inc。
####根据MPL获得许可。看见http://www.rabbitmq.com/
##  ##
##########日志:tty
########tty
##########
正在启动代理。。。
=信息报告===2016年10月20日::10:22:41===
在Erlang 19.0.7上启动RabbitMQ 3.6.5
版权所有(C)2007-2016 Pivotal Software,Inc。
根据MPL获得许可。看见http://www.rabbitmq.com/
=信息报告===2016年10月20日::10:22:41===
节点:rabbit@my-兔子
主目录:/var/lib/rabbitmq
配置文件:/etc/rabbitmq/rabbitmq.config
cookie散列:AlUJAQFic5TGBPlUjyyIOw==
日志:tty
sasl日志:tty
数据库目录:/var/lib/rabbitmq/mnesia/rabbit@my-兔子
=信息报告===2016年10月20日::10:22:42===
内存限制设置为799MB,总共1999MB。
=信息报告===2016年10月20日::10:22:42===
磁盘可用限制设置为50MB
=信息报告===2016年10月20日::10:22:42===
限制约1048476个文件句柄(943626个套接字)
=信息报告===2016年10月20日::10:22:42===
FHC读取缓冲:关闭
FHC写入缓冲:打开
=信息报告===2016年10月20日::10:22:42===
位于/var/lib/rabbitmq/mnesia的数据库目录/rabbit@my-兔子是空的。从头开始初始化。。。
=信息报告===2016年10月20日::10:22:42===
应用:记忆
退出:停止
类型:临时
=信息报告===2016年10月20日::10:22:43===
优先级队列已启用,实际BQ为兔子_变量_队列
=信息报告===2016年10月20日::10:22:43===
添加vhost“/”
=信息报告===2016年10月20日::10:22:43===
正在创建用户“来宾”
=信息报告===2016年10月20日::10:22:43===
将用户“来宾”的用户标记设置为[管理员]
=信息报告===2016年10月20日::10:22:43===
正在将“/”中“来宾”的权限设置为“.*”、“.*”、“.*”
=信息报告===2016年10月20日::10:22:43===
msg\u store\u transient:使用rabbit\u msg\u store\u ets\u索引提供索引
=信息报告===2016年10月20日::10:22:43===
msg\u store\u persistent:使用rabbit\u msg\u store\u ets\u索引提供索引
=警告报告===2016年10月20日::10:22:43===
msg_store_persistent:从头开始重建索引
=信息报告===2016年10月20日::10:22:43===
已在[:]上启动TCP侦听器:5672
已完成0个插件。
=信息报告===2016年10月20日::10:22:43===
服务器启动完成;0个插件已启动。
=信息报告===2016年10月20日::10:22:47===
接受AMQP连接(172.17.0.3:41166->172.17.0.2:5672)
=信息报告===2016年10月20日::10:22:47===
接受AMQP连接(172.17.0.3:41168->172.17.0.2:5672)
已修复。 我注意到了这一点。 我将
tasks.py
代理ip地址更改为localhost(因为RabbitMQ端口暴露于主机,其行为类似于localhost进程):

然后,我使用以下命令运行容器:

docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 -p 5672:5672 rabbitmq:3-management

docker run -v /Users/user/hostpath:/home/user --link some-rabbit:rabbit --name some-celery -d celery
并将
celeryconfig.py
文件添加到
/Users/user/hostpath

CELERY_IMPORTS = ('tasks')
CELERY_IGNORE_RESULT = False
CELERY_RESULT_BACKEND = 'amqp'
CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']

这就是我的工作:)

你能直接访问rabbitmq服务器吗?@Jason我已经在问题中添加了rabbitmq日志。我注意到你正在使用rabbitmq作为后端。如果从芹菜配置中删除
backend='amqp
,是否仍会发生这种情况?我想知道任务是否执行,但它会将响应保存到引发异常的后端。当你把loggin放进去会发生什么
docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 -p 5672:5672 rabbitmq:3-management

docker run -v /Users/user/hostpath:/home/user --link some-rabbit:rabbit --name some-celery -d celery
CELERY_IMPORTS = ('tasks')
CELERY_IGNORE_RESULT = False
CELERY_RESULT_BACKEND = 'amqp'
CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']