【问题标题】:Cannot run nodejs app and mongo within a docker container无法在 docker 容器中运行 nodejs app 和 mongo
【发布时间】:2014-09-27 05:06:15
【问题描述】:

我正在使用以下 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 项目/测试 即将派生子进程,等待服务器准备好连接。 分叉进程:10

然后它仍然卡住。

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

更新

我现在使用这个 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 秒
  • 运行我的节点(永久)进程

问题是,容器在永久进程运行后立即退出......它如何保持活动状态?

【问题讨论】:

    标签: node.js mongodb docker sails.js


    【解决方案1】:

    如果您想在一个容器内干净地启动多个服务,一种选择是使用某种进程管理器。记录了一个选项here, in the official Docker documentation

    我使用runit 做了类似的事情。您可以看到我的基础runit 图像here,以及使用该here 的多服务应用程序图像。

    【讨论】:

    • 我正在与主管一起尝试(虽然是非常好的提示!)但我遇到了一个新问题。由于我需要在其他进程启动之前启动 mongodb,因此主管似乎不会等待那么长时间来重试运行节点进程。
    • 您可以使用 shell 脚本包装您的其他服务,该脚本在启动服务之前等待 mongodb 可用。所以主管启动你的包装脚本,你的包装脚本等待 mongodb,当它可用时,你的包装脚本启动附加服务。
    • 关于如何检查 mongo 是否已启动并等待连接的任何提示?
    • 实际上,我对 mongo 一无所知,但大概您可以编写一些东西来对数据库执行查询。我看到官方 mongodb 文档有一个关于 monitoring 的部分,可能会提供一些思考的素材。
    猜你喜欢
    • 2020-12-24
    • 2018-09-24
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2022-07-18
    • 1970-01-01
    相关资源
    最近更新 更多