bash - 如何防止退出/bin/bash session 后停止Docker的容器

标签 bash docker clojure dockerfile leiningen

如何在退出作为/bin/bash提供的ENTRYPOINT session 后防止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 session ,我们可以在其中安装文本编辑器,对配置文件进行一些更改并通过lein run运行Web服务。但是问题是,当我们关闭bash session 时,整个Docker容器都将停止,因此该Web服务将不再可用。

在这种情况下我该怎么办?在我提供的示例中,您还看到哪些其他缺陷?

最佳答案

问题是您的/ 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 - 如何防止退出/bin/bash session 后停止Docker的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39439394/

相关文章:

clojure - Clojure 中的求值和宏

bash - 将 ISO8601 时间转换为 unix 时间戳的命令行

bash - bash脚本停止时运行命令

curl - OpenShift 3.1 - 防止 Docker 缓存 curl 资源

docker - 如何通过 Docker Hub API 确定标签的 Docker 镜像 ID?

clojure - 如何在 Clojure 中部分展平列表?

bash - 如何使用 UNIX 获取列表中唯一值的频率计数?

c++ - zsh/sh/bash 如何检查从 C++ 程序启动的命令 "cat &"的信号 SIGTTIN

linux - 如何在docker中监听端口?

map - 将 seq 扩展为单个标量