无法在Docker容器中运行nodejs应用程序和mongo

我正在用下面的Dockerfile设置一个容器

# Start with project/baseline FROM project/baseline # => image with mongo / nodejs / sailsjs # Create folder that will contain all the sources RUN mkdir -p /var/project # Load the configuration file and the deployment script ADD init.sh /var/project/init.sh ADD src/ /var/project/ # src contains a list of folder, each one being a sails app # Compile the sources / run the services / run mongodb CMD /var/project/init.sh 

容器运行时调用init.sh脚本。 它应该启动一些webapp和mongodb。

 #!/bin/bash PROJECT_PATH=/var/project # Start mongodb function start_mongo { mongod --fork --logpath /var/log/mongodb.log # attempt to have mongo running in daemon } # Start services function start { for service in $(ls);do cd $PROJECT_PATH/$service npm start # Runs sails lift on each service done } # start mongodb start_mongo # start web applications defined in /var/project start 

基本上,在/ var / project中有几个nodejs(sailsjs)应用程序。
当我运行容器时,我收到以下消息:

$ sudo docker运行-t -i projects / test关于forksubprocess,等到服务器准备好连接。 分叉过程:10

然后它仍然卡住。

如何启动mongo和sails进程并使容器保持运行状态?

UPDATE

我现在使用这个supervisord.conf文件

 [supervisord] nodaemon=false [program:mongodb] command=/usr/bin/mongod [program:process1] command=/bin/bash "cd /var/project/service1 && node app.js" [program:process2] command=/bin/bash "cd /var/project/service2 && node app.js" 

它在Dockerfile中调用如下所示:

 # run the applications (mongodb + project related services) CMD ["/usr/bin/supervisord"] 

由于我的服务依赖于mongo正确启动,所以supervisord不会等待很长时间,服务也不会启动。 任何想法解决?
顺便说一下,在同一个容器中使用mongo是最好的做法吗?

更新2

我回到了容器运行时调用的service.sh脚本。 我知道这是不干净的(但我会说这是暂时的,所以我可以解决我在主pipe的pb),但我做了以下几点:

  • 运行nohup mongod&
  • 等待60秒
  • 运行我的节点(永远)进程

事情是,永久进程后,容器退出运行…怎么能保持活跃?

如果你想干净地启动一个容器内的多个服务,一个select就是使用某种进程pipe理器。 Docker官方文档中提供了一个选项。

我用runit做了类似的事情 。 你可以在这里看到我的基本runit图像,以及在这里使用的多服务应用程序图像。