如何使用 dockerfiles CMD 运行 一个 shell 脚本
How to run a shell script using dockerfiles CMD
我正在使用 docker 文件构建一个简单的容器。这是 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 申请。
现在我有另一个容器 运行ning rabbitmq,我正在链接这两个容器,但是我的每次尝试都失败了,我的 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(); }
我原以为我的发布代码会在 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
所以这意味着我的容器不是 运行ning。
刚才我通过使用以下命令启动新容器来更新 /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'
A Docker 容器将在其主进程完成时停止。在您的情况下,这意味着两个 Java 应用程序将分叉到后台(因为 nohup
调用)然后脚本将立即完成并且容器将退出。
有几个解决方案:
- 最快最简单的解决方案是从 second java 调用中删除
nohup
调用。这样脚本将不会退出,直到第二个 Java 应用程序退出。
- 使用 runit 或 supervisord 等进程管理器来管理进程。
- 将罐子放在单独的容器中,然后直接调用 Java(这对我来说似乎是最好的解决方案)。
可以使用 tail -f /dev/null 或 tail 你的日志
我正在使用 docker 文件构建一个简单的容器。这是 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 申请。
现在我有另一个容器 运行ning rabbitmq,我正在链接这两个容器,但是我的每次尝试都失败了,我的 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(); }
我原以为我的发布代码会在 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
所以这意味着我的容器不是 运行ning。
刚才我通过使用以下命令启动新容器来更新 /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'
A Docker 容器将在其主进程完成时停止。在您的情况下,这意味着两个 Java 应用程序将分叉到后台(因为 nohup
调用)然后脚本将立即完成并且容器将退出。
有几个解决方案:
- 最快最简单的解决方案是从 second java 调用中删除
nohup
调用。这样脚本将不会退出,直到第二个 Java 应用程序退出。 - 使用 runit 或 supervisord 等进程管理器来管理进程。
- 将罐子放在单独的容器中,然后直接调用 Java(这对我来说似乎是最好的解决方案)。
可以使用 tail -f /dev/null 或 tail 你的日志