如何在不杀死整个容器的情况下终止docker容器默认命令?

我正在运行一个包含节点服务器的docker容器。 我想附加到容器,杀死正在运行的服务器,并重新启动(用于开发)。 但是,当我杀死节点服务器杀死整个容器(可能是因为我杀了容器启动的过程)。

这可能吗? 这个答案有帮助,但是并没有解释如何杀死容器的默认进程而不杀死容器(如果可能的话)。

如果我想做的事情是不可能的,围绕这个问题的最好方法是什么? 添加command: bash -c "while true; do echo 'Hit CTRL+C'; sleep 1; done"对于我的docker-compose中的每个图像,如链接答案的注释中所build议的,看起来不像理想解决scheme,因为它迫使我附加到我的容器后,他们是手动运行命令。

这是由Dockerdevise的。 每个容器应该是一个服务的无状态实例。 如果该服务中断,容器将被销毁。 如果该服务被请求/启动,则被创build。 如果你至less使用k8s,swarm,mesos,cattle等编排平台。

有一些应用程序代表PID 1而不是服务本身。 但这违背了微服务和容器的devise理念。 下面是一个可以作为PID 1运行的init系统的例子,它允许你随意的杀死和产生你的容器中的进程: https : //github.com/Yelp/dumb-init

为什么要重新启动节点服务器? 要应用从configuration文件或其他东西的变化? 如果是这样,你正在寻找一个方向错误的解决scheme。 您应该定义一个持久性卷,以便当容器重新生成时服务将重新读取所述configuration文件。

https://docs.docker.com/engine/admin/volumes/volumes/

如果您需要重新启动运行容器的进程,那么只需运行一个:

 docker restart $container_name_or_id 

执行正常操作时不需要执行容器,可以考虑使用debugging工具。

而不是改变脚本运行自动重新启动,我会移动到docker引擎,所以它是可见的,如果你的容器崩溃:

 docker run --restart=unless-stopped ... 

当使用上述选项运行容器时,除非您有意在容器上运行docker stop ,否则泊坞窗将为您重启。

至于为什么杀死容器中的pid 1closures它,就像在linux服务器上杀死pid 1一样。 如果你杀了init / systemd,那么这个盒子就会掉下来。 在容器的名称空间内,类似的规则适用,不能更改。