容器化的 Python 应用程序无法连接到 RabbitMQ - pika

问题描述

我一直在尝试将两个 hello-world python 应用程序(一个消费者和一个生产者)容器化,并让它们通过 RabbitMQ 相互通信。 在本地,当使用 localhost 作为 pika 连接的主机名时,一切正常。我可以在 5672 端口上发送和使用消息,在 15672 上我可以看到队列按预期工作。

当我尝试将这两个应用程序放入容器时出现问题。

消费者:

import pika,sys,os,socket

local_ip = socket.gethostbyname(socket.gethostname())
print(local_ip)


def main():
    connection = pika.BlockingConnection(pika.ConnectionParameters(host=str(local_ip)))
    channel = connection.channel()

    channel.queue_declare(queue='hello')

    def callback(ch,method,properties,body):
        print(" [x] Received %r" % body)

    channel.basic_consume(queue='hello',on_message_callback=callback,auto_ack=True)

    print(' [*] Waiting for messages. To exit press CTRL+C')
    channel.start_consuming()

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print('Interrupted')
        try:
            sys.exit(0)
        except SystemExit:
            os._exit(0)

如您所见,我编辑了主机参数以获取主机 IP,因为使用 localhost 我收到此错误

Traceback (most recent call last):
  File "/app/consumer.py",line 23,in <module>
    main()
  File "/app/consumer.py",line 8,in main
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
  File "/usr/local/lib/python3.10/site-packages/pika/adapters/blocking_connection.py",line 360,in __init__
    self._impl = self._create_connection(parameters,_impl_class)
  File "/usr/local/lib/python3.10/site-packages/pika/adapters/blocking_connection.py",line 451,in _create_connection
    raise self._reap_last_connection_workflow_error(error)
pika.exceptions.AMQPConnectionError

显然,这不是问题,因为我在传递主机 ip 时遇到了完全相同的错误

我正在使用社区映像 rabbitmq:3-management 在 docker 中运行 RabbitMQ 服务器。

这是这个消费者文件的 Dockerfile:

FROM python:rc-alpine

RUN mkdir /app
workdir /app
ADD . /app/
RUN pip install -r requirements.txt

EXPOSE 5672

CMD ["python","/app/consumer.py"]

我应该怎么做才能解决这个问题?我很确定这是一件微不足道的事,但我为此苦苦挣扎。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...