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

如何防止Docker';退出/bin/bash会话后阻止容器停止,bash,docker,clojure,dockerfile,leiningen,Bash,Docker,Clojure,Dockerfile,Leiningen,如何防止Docker的容器在退出作为入口点提供的/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/so

如何防止Docker的容器在退出作为
入口点提供的
/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"]
来自pandeiro/lein的

维护者
运行apt-get-update&&apt-get-install-y git
运行git克隆https://github.com/some/some.git &&cd web服务和lein deps
入口点[“/bin/bash”]
我之所以将
/bin/bash
作为入口点,是因为用户应该首先对web服务的配置文件进行一些更改

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


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

如果您在容器上的shell会话中,Ctrl+C将允许您断开连接而不停止容器。

问题是您的/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"

更改入口点,只要它是bash,就没有solution@user2915097那么我应该使用哪个入口点呢?我需要为用户提供一种在运行
web服务之前编辑配置的方法
可能是一个包含bash会话的shell脚本,然后运行
lein
为什么不使用docker volumes()将配置文件装载到容器中?@gtonic您能详细说明一下吗?如果我只是将包含
config
文件的主机上的卷“映射”到
webservice
s目录,则整个目录的内容将被该配置覆盖file@MarcYoung这是另一个用例。如果您的应用程序需要生成其他进程,那么是的,您需要使用一些init系统。然而,在许多情况下,您希望在应用程序启动之前执行一些工作,在这种情况下,
exec
调用更简单。那么
myconfigscript.sh
文件应该做什么呢?询问用户一些问题并生成配置文件?请注意,在我的情况下,这还不够——用户还应该将SSL证书放在
web服务
的目录中,这样您就可以为系统中的新用户动态创建自定义Leiningen环境了?