【发布时间】:2015-04-03 07:13:37
【问题描述】:
我正在使用fig 部署我的Node.js 应用程序。
fig.yml
web:
build: .
command: node app.js
links:
- db
ports:
- "1337:1337"
db:
image: dockerfile/mongodb
运行 fig run db env 给了我以下环境变量:
DB_PORT=tcp://172.17.0.29:27017
DB_PORT_27017_TCP=tcp://172.17.0.29:27017
DB_PORT_27017_TCP_ADDR=172.17.0.29
DB_PORT_27017_TCP_PORT=27017
DB_PORT_27017_TCP_PROTO=tcp
DB_PORT_28017_TCP=tcp://172.17.0.29:28017
DB_PORT_28017_TCP_ADDR=172.17.0.29
DB_PORT_28017_TCP_PORT=28017
DB_PORT_28017_TCP_PROTO=tcp
DB_NAME=/pos_db_run_3/db
我的应用程序的Dockerfile 看起来像这样
# Pull base image.
FROM dockerfile/nodejs
# install mongo client
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list
RUN apt-get update
RUN apt-get install -y dnsutils
RUN apt-get install -y mongodb-org-shell
# copy the source files into the image
COPY . /data/myapp
# Define working directory.
WORKDIR /data/myapp
# Install dependencies
RUN npm install
# Create default database and user
RUN mongo $DB_PORT < seed-mongo
RUN node/seed.js
EXPOSE 1337
# Define default command.
CMD ["bash"]
但是构建在 RUN mongo $DB_PORT < seed-mongo 失败
MongoDB shell version: 2.6.5
connecting to: test
2014-11-20T20:47:59.193+0000 warning: Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
2014-11-20T20:47:59.195+0000 Error: couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt failed at src/mongo/shell/mongo.js:146
exception: connect failed
Service 'web' failed to build: The command [/bin/sh -c mongo $DB_PORT < seed-mongo] returned a non-zero code: 1
根据fig docs,我最好将数据库简称为db,所以我尝试了
RUN mongo db < seed-mongo
但这给了我
MongoDB shell version: 2.6.5
connecting to: db
2014-11-20T21:08:11.154+0000 warning: Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
2014-11-20T21:08:11.156+0000 Error: couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt failed at src/mongo/shell/mongo.js:146
exception: connect failed
所以我在其中注入了一个RUN host db,只是为了看看db 是否真的是一个主机名。不,尽管上面的文档不是。
Step 10 : RUN host db
---> Running in 73b4dc787c79
Host db not found: 3(NXDOMAIN)
Service 'web' failed to build: The command [/bin/sh -c host db] returned a non-zero code: 1
所以我被难住了。
我应该如何与在我链接的 Docker 容器中运行的 mongo 实例交谈?
【问题讨论】:
-
afaik,类似
$DB_PORT的东西在 docker 文件中不受支持。 github.com/docker/docker/issues/5584,WORKDIR 除外 github.com/docker/docker/issues/2637 -
有什么原因不能使用官方的mongo镜像吗? registry.hub.docker.com/_/mongo
-
谢谢 Adrian 我以为我使用的是官方图片 - 我的错。我已经解决了这个问题,但它仍然离为我工作更近了。我显然错过了为数据库播种的一些合乎逻辑的步骤。或者,如果我可以找到 mongo 安装的默认用户名,那么我可以在我的应用程序中使用这些值,而无需使用特定用户/密码为数据库播种以供应用程序使用。
-
我认为这里最大的问题(以及为什么你找不到太多谷歌搜索)是你试图在 Dockerfile 中植入数据库。这使得 Dockerfile 不可移植。您应该真正避免这种方法,而是使用启动包装脚本(使用入口点或 cmd 运行)来执行此操作。该脚本应检查是否需要播种,并且仅在需要时才播种。
标签: node.js mongodb docker sails.js fig