validationdocker化的Spring Boot应用程序对docker化和链接的ActiveMQ
我开始我的activemq容器,如下所示:
docker run -p 61616:61616 -p 8161:8161 --name='activemq' -d \ -e 'ACTIVEMQ_LOGLEVEL=DEBUG' \ -e 'ACTIVEMQ_ADMIN_USER=bot' \ -e 'ACTIVEMQ_ADMIN_PASSWORD=blahblah' \ -e 'ACTIVEMQ_OWNER_LOGIN=bot' \ -e 'ACTIVEMQ_OWNER_PASSWORD=blahblah' \ -e 'ACTIVEMQ_JMX_LOGIN=bot' \ -e 'ACTIVEMQ_JMX_PASSWORD=blahblah' \ -v /data/activemq:/data/activemq \ -v /var/log/activemq:/var/log/activemq \ webcenter/activemq:latest
我的应用程序的application.yml具有以下内容:
spring: activemq: broker-url: ${ACTIVEMQ_PORT_61616_TCP} user: bot password: blahblah
我开始我的应用程序容器像这样:
docker run --name='myapp' \ -w /app/ -v /home/ubuntu/myapp/logs:/app/logs \ -v /home/ubuntu/myapp/config:/app/config \ -v /tmp:/tmp -p 4980:4980 \ --link activemq:activemq \ -d myapp
请注意,我将应用程序的容器与activemq容器链接起来。
最后,当我尝试从应用程序发送msg给activeMQ(通过骆驼路由 – 但我不认为这是相关的),我在日志中看到这一点:
javax.jms.JMSSecurityException: User name [bot] or password is invalid. at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:52) at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1417) at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1522) at org.apache.activemq.ActiveMQConnection.start(ActiveMQConnection.java:527) at org.springframework.jms.listener.AbstractJmsListeningContainer.refreshSharedConnection(AbstractJmsListeningContainer.java:400) at org.springframework.jms.listener.DefaultMessageListenerContainer.refreshConnectionUntilSuccessful(DefaultMessageListenerContainer.java:907) at org.springframework.jms.listener.DefaultMessageListenerContainer.recoverAfterListenerSetupFailure(DefaultMessageListenerContainer.java:882) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1053) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.SecurityException: User name [bot] or password is invalid. at org.apache.activemq.security.JaasAuthenticationBroker.addConnection(JaasAuthenticationBroker.java:80) at org.apache.activemq.broker.BrokerFilter.addConnection(BrokerFilter.java:92) at org.apache.activemq.broker.MutableBrokerFilter.addConnection(MutableBrokerFilter.java:97) at org.apache.activemq.broker.TransportConnection.processAddConnection(TransportConnection.java:764) at org.apache.activemq.broker.jmx.ManagedTransportConnection.processAddConnection(ManagedTransportConnection.java:79) at org.apache.activemq.command.ConnectionInfo.visit(ConnectionInfo.java:139) at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:294) at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:148) at org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:50) at org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:113) at org.apache.activemq.transport.AbstractInactivityMonitor.onCommand(AbstractInactivityMonitor.java:270) at org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83) at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:214) at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196) ... 1 common frames omitted Caused by: javax.security.auth.login.LoginException: No LoginModules configured for activemq-domain at javax.security.auth.login.LoginContext.init(LoginContext.java:264) at javax.security.auth.login.LoginContext.<init>(LoginContext.java:417) at org.apache.activemq.security.JaasAuthenticationBroker.addConnection(JaasAuthenticationBroker.java:72) ... 14 common frames omitted
不用说,在我的开发机器上本地运行这些组件(即没有docker化)时,这一切都“正常工作”。 只是不能在EC2实例的Docker容器内工作。
任何和所有帮助表示赞赏!
谢谢。
我最终通过定制docker镜像来实现它,如下所示:
-
克隆git repo:
git clone https://github.com/disaster37/activemq.git
-
修正传递给curl的URL:
assets/setup/install
(该文件中的当前url不再有效) -
编辑这个文件:
assets/config/activemq.xml
并用这个replace<jaasAuthenticationPlugin>
和<authorizationPlugin>
元素:
<simpleAuthenticationPlugin anonymousAccessAllowed="false"> <users> <authenticationUser username="system" password="blubblub" groups="users,admins"/> <authenticationUser username="bot" password="blahblah" groups="users"/> </users> </simpleAuthenticationPlugin>
-
build立我自己的docker形象:
docker build --tag="zackattack/activemq"
-
运行它:
docker logs -f $(docker run --name='activemq' -d zackattack/activemq)
这不是很漂亮 – 但它的作品!
从我可以从debugging日志中收集的数据来判断。 首先,debugging日志显示“bot”越过(名称),所以myapp和activemq之间似乎有连接。 所以这个联系正在起作用。 我的线索是:
Caused by: javax.security.auth.login.LoginException: No LoginModules configured for activemq-domain
我不知道login模块是什么,但是我猜想你需要告诉activemq如何处理它的名字/密码? 查看docker hub for activemq的描述,有一个例子:
-e 'ACTIVEMQ_READ_LOGIN=consumer_login' -e 'ACTIVEMQ_READ_PASSWORD=consumer_password'\
和
-e 'ACTIVEMQ_STATIC_TOPICS=topic1;topic2;topic3' -e 'ACTIVEMQ_STATIC_QUEUES=queue1;queue2;queue3'
是否有可能需要这些设置来configurationactivemq域login模块? 或者是在某个configuration文件中完成的? 从docker的angular度来看,我认为一切都是按顺序的。 我认为activemq有一个configuration问题。 在常规环境中运行时,如何启动activemq(命令行参数,环境variables和configuration文件是什么)?
- 在Docker中不能链接Consul和Spring Boot应用程序
- 在多主机networking上部署springboot cloud netflix是否正确?
- 在Windows上使用maven和spring-boot构buildDocker-Image
- SpringBoot与Tomcat使用大约190mb的内存。 什么过程在Springboot中运行?
- 如何重新启动一个新的弹簧引导JAR容器没有绝对path到jar子?
- jhipster-docker:spring-boot不会以控件C结束
- spring引导到mysqldocker通信
- 如何将Spring Boot应用程序部署到Google Managed VM
- docker-compose环境将覆盖jar中的variables,docker环境variables和jar中的variables如何映射?