Node.js Koa应用程序和CouchDB在单个容器中
我有一个koa.js应用程序,我想在泊坞窗容器中运行。 这个应用程序需要couchdb运行,我想在同一个容器中运输。 我知道这不是最佳做法,但确实是我的用户开始使用的最佳方式。
Dockerfile:
# DOCKER-VERSION 1.2.0 FROM centos:centos6 # Enable EPEL for CouchDB and Node.js RUN yum -y update; yum clean all RUN yum -y install epel-release; yum clean all RUN yum -y install tar # Install Node.js and CouchDB RUN yum -y install couchdb; yum clean all RUN service couchdb start RUN yum install -y nodejs RUN yum install -y npm # Bundle app source ADD . . # Install app dependencies RUN npm install RUN npm install -gn RUN n 0.11.12 # Expose port and run EXPOSE 8080 CMD ["npm", "start"]
这工作正常,应用程序启动,但无法连接到couchdb。 投掷一个
RUN service couchdb start
回应与确定,所以它似乎工作,但
curl -X GET 127.0.0.1:5984
回应
curl: (7) couldn't connect to host
相同的koa.js应用程序:
error: error stack=Error: connect ECONNREFUSED at exports._errnoException (util.js:745:11) at Object.afterConnect [as oncomplete] (net.js:995:19), code=ECONNREFUSED, errno=ECONNREFUSED, syscall=connect
有人知道我错过了什么或者我做错了什么?
在启动这个图像时运行的唯一命令是CMD行中的命令。 之前的每一行创build一个只读,非运行的图像。 因此,线路RUN service couchdb start
将立即启动服务,直到它被标记为成功,然后docker将停止该图像,保存它,并移动到下一行。 服务的“运行”状态不会持续。
这是一个常见的误解,当我开始的时候就陷入了一种误解。
这三个选项,最快最快但最耐用,最后是最多的工作,但最合适:
- 把
service couchdb start && npm start
作为您的CMD行。 - 创build一个startup.sh脚本,完成所有需要在那里执行的“运行”,并将其作为您的CMD行调用
- 使用旨在为你做这个东西的服务,经常推荐supervisord 。
这是一个常见问题,所以如果你有通过谷歌search结果search“在docker中启动服务”,你会看到更多关于这个主题的信息。