如何防止Docker的容器在退出/ bin / bash会话后被停止

时间:2016-09-11 18:37:28

标签: bash docker clojure dockerfile leiningen

如何在退出/bin/bash提供的ENTRYPOINT会话后阻止Docker的容器停止?

我的意思。假设我有一个用Clojure编写的Web服务,我想将它包装在一个容器中。这就是Dockerfile的样子:

FROM pandeiro/lein
MAINTAINER some <some@email.com>
RUN apt-get update && apt-get install -y git
RUN git clone https://github.com/some/some.git && cd web-service && lein deps
ENTRYPOINT ["/bin/bash"]

我提出/bin/bash入口点的原因是用户应首先对Web服务的配置文件进行一些更改。

当我们执行docker run -p 443:443 -t -i container-name时,它会打开/bin/bash会话,我们可以在其中安装文本编辑器,对配置文件进行一些更改并通过lein run运行Web服务。但问题是,当我们关闭bash会话时,整个Docker容器都会停止,因此Web服务将不再可用。

在这种情况下我该怎么办?你在我提供的例子中看到了哪些其他缺陷?

2 个答案:

答案 0 :(得分:2)

问题是您的/ bin / bash是由docker作为PID1启动的。 PID1进程接收SIGINT和SIGKILL,并负责终止子进程。为了解决这个问题,您可以使用exec启动应用程序,将其作为PID1进程而不是bash安装。

您还应该自动化容器中的任何配置步骤。交互式(-it)登录主要用于帮助开发/调试容器。避免在部署中执行任何手动步骤。

docker run -p 443:443 container-name bash -c "myconfigscript.sh && exec lein run"

答案 1 :(得分:0)

如果您在容器上的shell会话中,Ctrl + C将允许您在没有容器停止的情况下断开连接。