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