如何使用dockerfiles CMD运行shell脚本

时间:2015-02-19 13:55:46

标签: docker dockerfile

我正在使用dockerfiles来构建一个简单的容器。这是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容器没有启动。有人可以建议如何调试这个问题吗?不知怎的,码头日志没有任何东西。

以下是我如何链接容器: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容器中创建一个队列并开始推送消息。我的用户代码基本上会连接到同一个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

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

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

2 个答案:

答案 0 :(得分:5)

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

有一些解决方案:

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

答案 1 :(得分:0)

可以使用tail -f / dev / null或尾随日志