我有一个带有生产者和接收者的春季启动应用程序,它使用本地rabbitmq来发送和接收消息。我试图在docker容器上部署app和rabbit,并且一旦部署就运行启动应用程序。应用程序启动后,它有一个实现Spring CommandLineRunner的生产者,这意味着应用程序立即开始发送消息,因此必须先运行rabbitmq代理。我是码头工人的新手。我到目前为止尝试过:
1)。我为spring boot app创建了图像,如下所示
FROM java:8
EXPOSE 8080
ADD /target/MessagingApp.jar MessagingApp.jar
ENTRYPOINT ["java","-jar","MessagingApp.jar"]
2)。然后为兔子和我新创建的图像创建了docker.compose文件
rabbitmq:
image: rabbitmq:management
ports:
- "5672:5672"
- "15672:15672"
messagingapp:
image: messagingapp:latest
ports:
- "80:8080"
links:
- rabbitmq
然后我运行了docker-compose up我可以看到兔子在某种程度上开始,然后是春季启动应用程序但是无法发送消息
at com.rabbitmq.client.impl.SocketFrameHandlerFactory.create..
我认为我的问题是我的春季启动应用会自动尝试连接到localhost兔主机。那么我该如何指向docker rabbitmq服务器?
任何帮助?
答案 0 :(得分:1)
尝试为links
更新depends_on
的部分内容。您的申请可能在messagingapp
之前开始。
depends_on
docker-compose up将按依赖顺序启动服务。当docker-compose执行V2文件时,它将自动在文件中定义的所有容器之间建立一个网络,并且每个容器将立即使用docker-compose.yml文件中定义的名称立即引用其他容器。
<强>但是强>
注意:depends_on不会等到db和redis在启动web之前“准备好” - 只有在它们启动之前才会“准备好”。
您需要添加command
来检查服务状态。更多文档...
depends_on:
- "db"
command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
答案 1 :(得分:0)
您的Dockerfile和docker-compose.yml文件似乎正确,除了两件事:
您需要使用links
来代替关键字depends_on
。这将首先构建并运行RabbitMQ实例,然后构建并运行您的Web服务。
您应将此行添加到messagingapp服务下:
->
environment:
- SPRING_RABBITMQ_HOST=rabbitmq
这将使您的Spring Boot应用程序能够识别Docker中的RabbitMQ映像。
因此,尝试像这样更新docker-compose.yml文件:
rabbitmq:
image: rabbitmq:management
ports:
- "5672:5672"
- "15672:15672"
messagingapp:
image: messagingapp:latest
ports:
- "80:8080"
environment:
- SPRING_RABBITMQ_HOST=rabbitmq
depends_on:
- rabbitmq