在链接的Docker容器中向Mongo db种植数据

3
我正在使用 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文档,我最好将数据库简单地称为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 实例进行通信呢?


据我所知,在Docker文件中不支持像$DB_PORT这样的东西。除了WORKDIR之外,详情请参见https://github.com/docker/docker/issues/5584和https://github.com/docker/docker/issues/2637。 - ymonad
你不能使用官方的Mongo镜像吗?https://registry.hub.docker.com/_/mongo/ 有什么原因吗? - Adrian Mouat
谢谢Adrian,我以为我在使用官方镜像 - 我错了。我已经修复了,但对于我来说仍然没有更接近的工作方式。显然,我在种子数据库方面缺少一些逻辑步骤。或者,如果我能找到mongo安装的默认用户名,那么我就可以在我的应用程序中使用这些值,而不需要为应用程序使用特定的用户/密码来种子数据库。 - Dave Sag
1
我认为这里最大的问题(也是为什么你在谷歌上找不到太多信息的原因)是你试图在 Dockerfile 中种子数据库。这使得 Dockerfile 不可移植。你应该避免这种方法,而是使用启动包装脚本(使用 entrypoint 或 cmd 运行)来完成它。该脚本应检查是否需要进行种子操作,并且只有在必要时才进行种子操作。 - jmar
3个回答

3

您的Mongo容器具有IP地址 $DB_PORT_27017_TCP_ADDR。
因此,请尝试使用 mongo --host $DB_PORT_27017_TCP_ADDR < seed-mongo
我认为您不能在RUN语句中使用它,因为环境变量在构建时不可用。我猜您可以在CMD中尝试使用它。


1
我的理解是,CMD 中的任何内容都会在每次运行镜像时运行,这不是我想要的。我只想种植数据库和用户,然后将一些种子数据作为单独的步骤推送到该数据库中。但仅在构建时进行,而不是每次容器启动时都进行。我认为这应该是一个非常常见的用例,但搜索了几天也没有找到有用的东西。 - Dave Sag
ONBUILD指令怎么样? - Eric Francis

1
我的解决方案结合了上述的见解,但主要是停止在构建阶段尝试种植特定的数据库和数据库用户,而是使用--host db_1而没有用户名或密码。如果我以后真的需要这个功能,我会想办法解决它。
然后我可以构建项目并将其连接到另一个镜像中的mongo
在我的config/connections.js中,我包含了:
development: {
  adapter  : 'sails-mongo',
  host     :  'db_1',
  port     :  27017,
  user     :  '',
  password :  '',
  database :  process.env.DB_NAME
},

我将 CMD 改成了 "node data/seeds.js && node app"


0
你从来没有暴露过你的Mongo端口。
web:
  build: .
  command: node app.js
  links:
   - db
  ports:
   - "1337:1337"

db:
  image: dockerfile/mongodb
  ports:
    - "27017:27017"

在这种情况下,这并不重要。主机不需要为构建另一个镜像分配其端口。 - jmar
2
标准的 mongo 镜像无论如何都会暴露该端口。 - Dave Sag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接