我看过一堆教程,它们似乎和我想做的事情一样,但由于某种原因,我的 Docker 容器退出了。基本上,我在 Docker 容器中设置了一个 Web 服务器和一些守护进程。我通过一个 bash 脚本来完成最后的部分,该脚本run-all.sh在我的 Dockerfile 中通过 CMD 运行。run-all.sh看起来像这样:
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 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 循环来保持它,但是阻止它退出的正确方法是什么?
这不是你应该如何设计 Docker 容器的方式。
在设计 Docker 容器时,您应该构建它以便只运行 一个 进程(即,您应该有一个用于 Nginx 的容器,一个用于 supervisord 或它正在运行的应用程序);此外,该进程应该在前台运行。
当进程本身退出时,容器将“退出”(在您的情况下,该进程是您的 bash 脚本)。
但是,如果您 确实 需要(或想要)在 Docker 容器中运行多个服务,请考虑从“Docker Base Image”开始,它runit用作伪初始化进程(runit将在 Nginx 和 Supervisor 运行时保持在线),它将保持在前台,而你的其他进程做他们的事情。
runit
他们有大量的文档,所以你应该能够轻松地实现你想要做的事情。