如何使用dockerfiles CMD运行shell脚本

ash*_*ain 6 docker dockerfile

我使用dockerfiles来构建一个简单的容器.这是Dockerfile:

FROM XXXXXXX:5003/base-java

MAINTAINER XXXXX

ADD pubsub/ /opt/pubsub/

CMD ["/opt/pubsub/run.sh"]
Run Code Online (Sandbox Code Playgroud)

内容run.sh如下:

#!/bin/bash
nohup java -jar /opt/pubsub/publish.jar &
nohup java -jar /opt/pubsub/subscribe.jar &
Run Code Online (Sandbox Code Playgroud)

这是简单的java应用程序pub/sub.

现在我有另一个运行rabbitmq的容器,我正在连接2​​个容器,但是我的每个尝试都失败了,而我的pub/sub容器没有启动.有人可以建议如何调试这个问题吗?不知何故,docker日志没有任何东西.

这是我如何链接容器: sudo docker run -d -P --name pub_sub --link rabbitmq:rabbitmq1 image_pub_sub

以下是我在pub/sub代码中使用别名的方法

factory = new ConnectionFactory(); 
factory.setHost("rabbitmq1"); 
try { connection = factory.newConnection(); 
channel = connection.createChannel(); 
channel.queueDeclare("pub", true, false, false, null); 
} 
catch (IOException e) { // TODO Auto-generated catch block 
e.printStackTrace(); }
Run Code Online (Sandbox Code Playgroud)

我期待我的发布代码将在rabbitmq容器中创建一个队列并开始推送消息.我的用户代码基本上连接到同一个rabbitmq并开始阅读消息.

当我运行命令没有任何反应时,它只打印新容器的长ID并退出..当我运行时sudo docker ps -a,我可以看到以下内容:

e8a50d5aefa5     image_pub_sub:latest     "/opt/pubsub/run.sh"     32 minutes ago     Exited (0) 32 minutes ago     pub_sub
Run Code Online (Sandbox Code Playgroud)

所以这意味着我的容器没有运行.

刚才我通过/etc/hosts使用以下命令启动一个新容器来更新它进行测试:sudo docker run -i -t image_pub_sub /bin/bash.修改了/etc/hosts这个新容器并添加了以下条目<IP_ADDRESS> rabbitmq1并运行了我的脚本/opt/pubsub/run.sh,它将nohup文件附加以下消息:

Message Sent
 [x] Received 'Hello'
Message Sent
Message Sent
 [x] Received 'Hello'
Run Code Online (Sandbox Code Playgroud)

Adr*_*uat 6

Docker容器将在其主进程完成时停止.在您的情况下,这意味着两个Java应用程序将分叉到后台(因为nohup调用),然后脚本将立即完成,容器将退出.

有几个解决方案:

  • 最快捷,最简单的解决方案就是nohup第二次 java调用中删除调用.这样,在第二个Java应用程序退出之前,脚本不会退出.
  • 使用诸如runit或supervisord之类的流程管理器来管理流程.
  • 将罐子放在单独的容器中并直接调用Java(这对我来说似乎是最好的解决方案).