如何使用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)。