当前位置 : 主页 > 网页制作 > Nodejs >

node.js – 无法在docker容器中运行nodejs app和mongo

来源:互联网 收集:自由互联 发布时间:2021-06-16
我正在使用以下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
我正在使用以下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 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的多服务应用程序图像.

网友评论