如何使用dockerfiles CMD运行一个shell脚本

我正在使用dockerfiles来构build一个简单的容器。 这是Dockerfile

 FROM XXXXXXX:5003/base-java MAINTAINER XXXXX ADD pubsub/ /opt/pubsub/ CMD ["/opt/pubsub/run.sh"] 

run.sh内容如下所示:

 #!/bin/bash nohup java -jar /opt/pubsub/publish.jar & nohup java -jar /opt/pubsub/subscribe.jar & 

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

现在我有另一个容器运行rabbitmq,我连接了2个容器,但是我的每个尝试都失败了,而我的pub/sub容器没有启动。 有人可以build议如何去debugging这个问题? 不知何故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(); } 

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

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

 e8a50d5aefa5 image_pub_sub:latest "/opt/pubsub/run.sh" 32 minutes ago Exited (0) 32 minutes ago pub_sub 

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

刚才我通过使用以下命令启动一个新的容器来更新/etc/hosts来testing: 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' 

当主进程完成时,Docker容器将停止。 在你的情况下,这意味着两个Java应用程序将分支到后台(由于nohup调用),那么脚本将立即完成,容器将退出。

有几个解决scheme:

  • 最快最简单的解决scheme是从第二个 java调用中删除nohup调用。 这样,直到第二个Java应用程序退出,脚本才会退出。
  • 使用诸如runit或supervisord之类的进程pipe理器来pipe理进程。
  • 把jar子放在不同的容器中,直接调用Java(这对我来说似乎是最好的解决scheme)。