我正在使用以下Dockerfile设置容器 # Start with project/baselineFROM project/baseline # = image with mongo / nodejs / sailsjs# Create folder that will contain all the sourcesRUN mkdir -p /var/project# Load the configuration file an
# 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 run -t -i projects / test
即将分叉子进程,等待服务器准备好连接.
分叉过程: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脚本.我知道这不干净(但我会说它是暂时的,所以我可以修复我在主管中的pb),但我正在做以下事情:
>运行nohup mongod&
>等待60秒
>运行我的节点(永远)进程
问题是,永久进程运行后的容器出口…如何保持活动状态?
如果要在容器内干净地启动多个服务,可以选择使用某种流程管理器.一个选项记录在 here, in the official Docker documentation中.我使用runit做了类似的事情.您可以看到我的基础runit图像here,以及使用该here的多服务应用程序图像.