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

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

我的意思是。 假设我有一个用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服务的configuration文件进行一些修改。

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

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

问题是你的/ bin / bash由docker启动为PID1。 PID1进程接收到SIGINT和SIGKILL,并负责查杀subprocess。 为了解决这个问题,你可以用exec来启动你的应用程序,它将把它作为PID1进程而不是bash进行安装。

您还应该自动化您的容器中的任何configuration步骤。 交互式( -it )login主要用于帮助开发/debugging容器。 避免部署中的任何手动步骤。

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

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