我看过一堆教程,它们似乎和我想做的事情一样,但由于某种原因,我的 Docker 容器退出了。基本上,我在 Docker 容器中设置了一个 Web 服务器和一些守护进程。我通过一个名为 run-all.sh
的 bash 脚本来完成最后的部分,我在 Dockerfile 中通过 CMD 运行该脚本。 run-all.sh
看起来像这样:
service supervisor start
service nginx start
我在我的 Dockerfile 中启动它,如下所示:
CMD ["sh", "/root/credentialize_and_run.sh"]
我可以看到,当我手动运行时(即使用 -i -t /bin/bash 进入映像),所有服务都正确启动,并且在我运行映像时一切看起来都正常运行,但它退出了一次它完成了我的流程的启动。我希望进程无限期地运行,据我所知,容器必须继续运行才能发生这种情况。不过,当我运行 docker ps -a
时,我看到:
➜ docker_test docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7706edc4189 some_name/some_repo:blah "sh /root/run-all.sh 8 minutes ago Exited (0) 8 minutes ago grave_jones
是什么赋予了?为什么要退出?我知道我可以在我的 bash 脚本的末尾放置一个 while 循环来保持它,但是阻止它退出的正确方法是什么?
原文由 Eli 发布,翻译遵循 CC BY-SA 4.0 许可协议
这不是你应该如何设计 Docker 容器的方式。
在设计 Docker 容器时,您应该构建它以便只运行 一个 进程(即您应该有一个用于 Nginx 的容器,一个用于 supervisord 或它正在运行的应用程序);此外,该进程应该在前台运行。
当进程本身退出时,容器将“退出”(在您的情况下,该进程是您的 bash 脚本)。
但是,如果您 确实 需要(或想要)在 Docker 容器中运行多个服务,请考虑从 “Docker Base Image” 开始,它使用
runit
作为伪初始化进程(runit
在 Nginx 和 Supervisor 运行时将保持在线),当您的其他进程执行它们的操作时,它将保持在前台。他们有大量的文档,所以你应该能够轻松地实现你想要做的事情。