【问题标题】:How do you kill a docker containers default command without killing the entire container?如何在不杀死整个容器的情况下杀死 docker 容器默认命令?
【发布时间】:2017-08-20 00:51:31
【问题描述】:

我正在运行一个包含节点服务器的 docker 容器。我想附加到容器,杀死正在运行的服务器,然后重新启动它(用于开发)。但是,当我杀死节点服务器时,它会杀死整个容器(大概是因为我正在杀死容器启动的进程)。

这可能吗? This answer 有帮助,但它没有解释如何在不杀死容器的情况下杀死容器的默认进程(如果可能的话)。

如果我试图做的事情是不可能的,解决这个问题的最佳方法是什么?正如链接答案的 cmets 中所建议的那样,将command: bash -c "while true; do echo 'Hit CTRL+C'; sleep 1; done" 添加到我的 docker-compose 中的每个图像似乎不是理想的解决方案,因为它迫使我在容器启动后附加到我的容器并手动运行命令.

【问题讨论】:

  • 停止 nodejs 后是否有健康检查失败?

标签: docker docker-compose dockerfile


【解决方案1】:

这是 Docker 设计的。每个容器都应该是服务的无状态实例。如果该服务中断,则容器将被销毁。如果该服务被请求/启动,它就会被创建。如果您使用的是像 k8s、swarm、mesos、cattle 等这样的编排平台,至少。

存在表示 PID 1 而不是服务本身的应用程序。但这违背了微服务和容器的设计理念。下面是一个可以作为 PID 1 运行的 init 系统示例,它允许您随意杀死和生成容器内的进程:https://github.com/Yelp/dumb-init

为什么要重启节点服务器?从配置文件或其他东西中应用更改?如果是这样,您正在寻找错误方向的解决方案。相反,您应该定义一个持久卷,以便在容器重新生成时服务将重新读取所述配置文件。

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

【讨论】:

    【解决方案2】:

    如果您需要重新启动运行容器的进程,则只需运行:

    docker restart $container_name_or_id
    

    正常操作不需要执行到容器中,考虑使用调试工具。

    我不会将运行的脚本更改为自动重启,而是将其移至 docker 引擎,以便在容器崩溃时可见:

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

    当使用上述选项运行容器时,docker 将为您重新启动它,除非您故意在容器上运行 docker stop

    至于为什么在容器中杀死pid 1会关闭它,这和在linux服务器上杀死pid 1是一样的。如果您杀死 init/systemd,该框将关闭。在容器的命名空间内,应用类似的规则并且不能更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      相关资源
      最近更新 更多