我正在使用以CMD ["/start.sh"]结尾的Dockerfile:
#!/bin/bash
service ssh start
/usr/bin/node /myApp/app.js
如果由于某种原因我需要终止节点进程,则SSH服务器也会关闭(迫使我重新启动容器以重新连接(。
有什么简单的方法可以避免这种行为吗?
谢谢。
容器的主进程退出后,容器立即退出。在您的情况下,容器内的主要进程是start.sh
shell 脚本。start.sh shell 脚本正在启动 ssh 服务,然后将 nodejs 进程作为子进程运行。一旦 nodejs 进程死亡,shell 脚本也会退出,因此容器也会退出。所以你可以做的是把nodejs进程放在后台。
#!/bin/bash
service ssh start
/usr/bin/node /myApp/app.js &
# Need the following infinite loop as the shell script should not exit
while do:
sleep 2
done
不过,我不推荐这种方法。每个容器只能有一个进程。阅读以下答案以了解原因 -
在一个 docker 容器中运行多个应用程序
如果您仍然想在容器内运行多个进程,有更好的方法可以做到这一点,例如使用 supervisord - https://docs.docker.com/config/containers/multi-service_container/