【问题标题】:Docker container exits even when run with -it即使使用 -it 运行 Docker 容器也会退出
【发布时间】:2018-10-18 05:20:56
【问题描述】:

我正在尝试在 docker 容器中运行自定义服务。该服务以myservice start 启动 - 然后分叉和守护主进程并退出。然后主进程在网络套接字上侦听传入命令。该过程本身运行良好。

在我的 Dockerfile 中,我将其作为最后两个命令:

WORKDIR "/app/myservice"
CMD ["bin/myservice", "start"]

镜像构建成功。现在,当我这样运行它时:

docker run -d -p 7890:7890 myimage

容器启动然后退出。在日志中,我可以看到服务在容器以退出代码 0 退出之前启动。这是预期的,因为来自 dockerfile 的命令以代码 0 退出。

看看this question,很明显如果我这样运行它:

docker run -dit -p 7890:7890 myimage

即使在启动我的服务的批处理脚本退出后,容器也应该保持运行。然而情况并非如此 - 容器终止后立即退出。

我错过了什么?如何让容器保持运行?

【问题讨论】:

  • 只要启动的命令处于活动状态,容器就会存在,可以添加 ; sleep infinity 或诸如此类

标签: docker containers


【解决方案1】:

比较这两个容器的寿命

1) docker run -it ubuntu sh -c "echo Hello ; sleep 3"

2) docker run -it ubuntu sh -c "while true ; do echo Hello ; sleep 3 ; done"

检查 CMD 的文档

https://docs.docker.com/engine/reference/builder/#cmd

和入口点

https://docs.docker.com/engine/reference/builder/#entrypoint

当你

docker run -it ubuntu bash

只要您退出 bash,您的容器就会完成并退出。

检查一下

What is the difference between CMD and ENTRYPOINT in a Dockerfile?

`

【讨论】:

    【解决方案2】:

    一般来说,您不需要对容器中的任何内容进行守护进程。常见的模式是启动一个永远存在的命令并打印到 STDOUT/STDERR。 当/如果该命令失败,容器将停止。 所以,删除

    ...然后分叉和守护主进程并退出...

    部分并启动您的主进程。

    【讨论】:

      【解决方案3】:

      当容器第一个 PID 1(已更新!)进程完成(以 0 或其他退出)时,容器也会退出。

      为了让你的容器保持活动状态,第一个 pid 也必须保持活动状态......

      在你的脚本myservice的最后,你可以添加这一行tail -f /dev/null

      【讨论】:

      • 次要,它是 pid 1,而不是 0。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 2021-07-15
      • 2018-10-15
      • 2019-09-26
      • 1970-01-01
      • 2018-08-30
      • 2021-11-03
      相关资源
      最近更新 更多