docker - 如何使用 dockerfiles CMD 运行 shell 脚本

标签 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容器不启动。有人可以建议如何调试这个问题吗?不知何故 docker logs 没有任何东西。

这是我链接容器的方式: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'

最佳答案

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

有几个解决方案:

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

关于docker - 如何使用 dockerfiles CMD 运行 shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28608187/

相关文章:

python-3.x - docker 错误 : FileNotFoundError: [Errno 2]

docker - 在Dockerfile中的容器内复制文件

docker - Docker不添加现有文件

Spring Cloud 项目中的 Docker 容器化

linux - docker api ContainerExecInspect 无法获得正确的退出代码

docker - Dockerfile 中的 RUN 命令不会在容器之间持续存在

docker - 使用 docker compose 运行解析服务器

docker - Docker-compose无法解析DNS来纠正服务

node.js - 使用 node.js 应用程序启动 docker 容器会产生错误;提示 PATH

docker - 我如何使用 ansible 从不安全的 docker 注册表中提取?