【问题标题】:Seeding data in a Mongo db within a linked Docker container在链接的 Docker 容器中的 Mongo 数据库中播种数据
【发布时间】: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 &lt; 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


【解决方案1】:

您的 mongo 容器的 IP 地址为 $DB_PORT_27017_TCP_ADDR
所以试试mongo --host $DB_PORT_27017_TCP_ADDR &lt; seed-mongo
我认为您不能在 RUN 语句中使用它,因为环境变量在构建时不可用。我猜你可以尝试在 CMD 中使用它。

【讨论】:

  • 我的理解是每次运行图像时都会运行CMD中的任何内容,这不是我想要的。我只想为数据库和用户播种,然后将一些种子数据作为单独的步骤推送到该数据库中。但仅限于构建。不是每次容器启动时。我原以为这将是一个非常常见的用例,但几天的搜索并没有产生任何有用的结果。
  • ONBUILD 指令呢?
【解决方案2】:

我的解决方案是综合上述见解,但主要是我不再尝试在构建阶段为特定数据库和数据库用户播种,而是使用没有用户名或密码的--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 &amp;&amp; node app"

【讨论】:

    【解决方案3】:

    您从未暴露过您的 Mongo 端口。

    web:
      build: .
      command: node app.js
      links:
       - db
      ports:
       - "1337:1337"
    
    db:
      image: dockerfile/mongodb
      ports:
        - "27017:27017"
    

    【讨论】:

    • 在这种情况下应该无关紧要。主机不需要为构建另一个映像分配其端口。
    • 标准的mongo 图像无论如何都会暴露该端口
    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2015-08-28
    • 2023-04-02
    • 2018-07-26
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多