我正在运行一个包含节点服务器的docker容器。我想附加到容器,杀死正在运行的服务器,然后重新启动它(用于开发)。但是,当我杀死节点服务器时,它会杀死整个容器(可能是因为我正在杀死容器启动的进程)。
这可能吗? This answer有所帮助,但它没有解释如何在不杀死容器的情况下终止容器的默认进程(如果可能的话)。
如果我想做的事情不可能,那么解决这个问题的最佳方法是什么?如链接答案的评论中所示,在我的docker-compose中为每个图像添加command: bash -c "while true; do echo 'Hit CTRL+C'; sleep 1; done"
似乎不是理想的解决方案,因为它强制我在我们的容器启动并运行之后附加到我的容器手动命令。
答案 0 :(得分:3)
这是由Docker设计的。每个容器都应该是服务的无状态实例。如果该服务中断,则容器将被销毁。如果请求/启动该服务,则会创建该服务。如果你至少使用像k8s,swarm,mesos,cattle等编排平台。
存在表示PID 1而不是服务本身的应用程序。但这违背了微服务和容器的设计理念。下面是一个init系统的示例,它可以作为PID 1运行,并允许您随意终止和生成容器中的进程:https://github.com/Yelp/dumb-init
为什么要重启节点服务器?要从配置文件或其他东西应用更改?如果是这样,您就会在错误的方向上寻找解决方案。您应该改为定义持久卷,以便在容器重新生成服务时重新读取所述配置文件。
答案 1 :(得分:2)
如果您需要重新启动正在运行容器的进程,那么只需运行:
docker restart $container_name_or_id
正常操作不需要执行容器,请考虑使用调试工具。
我不会将运行的脚本更改为自动重启,而是将其移至docker引擎,以便在容器崩溃时可见:
docker run --restart=unless-stopped ...
当使用上述选项运行容器时,docker会为您重新启动它,除非您故意在容器上运行docker stop
。
至于为什么在容器中杀死pid 1会将其关闭,这与在linux服务器上杀死pid 1相同。如果您杀死init / systemd,该框将会关闭。在容器的命名空间内,类似的规则适用且无法更改。