docker上不能停留的货柜 – 组成

编写一个简单的生产者/消费者RabbitMQ的例子,我不能让我的消费者容器继续在docker-compose up -d运行docker-compose up -d 。 它应该在无限循环上运行。

在这里输入图像说明

正如你所看到的,当运行docker-compose run consumer以及docker-compose run -d consumer时,可以使其保持docker-compose run -d consumer

app.py

 #!/usr/bin/env python import argparse import pika import json connection = None channel = None TYPES = ['producer', 'consumer'] def producer(): global connection, channel connection = pika.BlockingConnection(pika.ConnectionParameters('rabbit')) channel = connection.channel() channel.queue_declare(queue='hello') # Currently a python dict data = { 'key': 'myvalue' } channel.basic_publish(exchange='', routing_key='hello', body=json.dumps(data)) # Encode as a JSON string print(f' [x] Sent {data}') connection.close() def consumer(): global connection, channel connection = pika.BlockingConnection(pika.ConnectionParameters('rabbit')) channel = connection.channel() channel.queue_declare(queue='hello') def callback(ch, method, properties, body): data = json.loads(body) # decode JSON string into a python dict print(f' [x] Received: {data} type {type(data)}') channel.basic_consume(callback, queue='hello', no_ack=True) print(' [*] Waiting for messages. To exit press CTRL+C') # Infinite loop try: channel.start_consuming() except KeyboardInterrupt: print('\nExiting...') def main(): parser = argparse.ArgumentParser() parser.add_argument('type', help='producer/consumer') args = parser.parse_args() client_type = args.type.lower() if client_type not in TYPES: print(f'{client_type} is not a valid type {TYPES}') elif client_type == TYPES[0]: producer() elif client_type == TYPES[1]: consumer() if __name__ == '__main__': main() 

正如你所看到的,这是非常简单的。 基本上从RabbitMQ文档复制它。 我写了大部分这个后运行docker-compose logs consumer ,并得到以下。

在这里输入图像说明

这表明它没有连接上初始构build。 即使在初始构build之后运行docker-compose up时,它也不能保持。

泊坞窗,compose.yml

 version: '3' services: producer: build: . consumer: build: . depends_on: - rabbit command: example consumer rabbit: image: rabbitmq:3.6 

我使用了depends_on因为我认为应该确保消费者服务是在RabbitMQ服务之后构build的。

代码的回收是在这里

您是否尝试过使用restart关键字为consumer容器设置重新启动策略? 在这种情况下经常发生的事情是,在这个服务运行之前,你的应用程序试图连接到一个后端服务(在这种情况下是RabbitMQ)并且一切都会崩溃。 如果你设置了重启策略,docker会自动重启容器,希望到这个时候,你的后台服务将会启动并运行。

有更高级的方法可以做到这一点,但最简单的方式是适用于您。

您可以通过重新启动消费者容器并查看它是否保持运行来testing我的理论。

 docker-compose restart consumer