2

我有一个想要在 docker 容器中运行的 koa.js 应用程序。这个 loa 应用程序需要 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 -g n
RUN n 0.11.12

# Expose port and run
EXPOSE 8080
CMD ["npm", "start"]

效果很好,应用程序启动但无法连接到 couchdb。投入一个

RUN service couchdb start

以 OK 响应,所以它似乎有效,但是

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

有人知道我错过了什么或我做错了什么?

4

1 回答 1

2

启动此映像时运行的唯一命令是 CMD 行中的命令。之前的每一行都会创建一个只读的、非运行的图像。因此,该行将RUN service couchdb start立即启动服务,直到它被标记为成功,然后 docker 将停止该图像,保存它,然后继续下一行。服务的“运行”状态不会持续存在。

这是一种常见的误解,我刚开始时就陷入了这种误解。

这三个选项,顶部是最快但最 hacky,最后是最有效但最合适的:

  1. 放置service couchdb start && npm start为您的 CMD 行。
  2. 创建一个 startup.sh 脚本,在其中执行您需要执行的所有“运行”,并将其称为 CMD 行
  3. 使用专门为你做这些事情的服务,通常推荐使用supervisord 。

这是一个常见问题,因此,如果您阅读了搜索“在 docker 中启动服务”的 google 结果,您将看到有关该主题的更多信息。

于 2014-11-19T16:33:46.840 回答