【问题标题】:Docker Compose : NodeJS + MongoDB码头工人组成:NodeJS + MongoDB
【发布时间】:2015-11-28 09:39:04
【问题描述】:

我无法让我的 docker compose 工作。

这是我的 dockerfile:

FROM node:0.12
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /myapp
WORKDIR /myapp
ADD . /myapp
RUN npm install

我的 docker-compose.yml

db:
  image: mongo
  ports:
    - 27017
web:
  build: .
  command: npm start
  volumes:
    - .:/myapp
  ports:
    - 3000:3000
  links:
    - db
  environment:
    PORT: 3000

在 server.js 中:

  var MONGO_DB;
  var DOCKER_DB = process.env.DB_1_PORT;
  if ( DOCKER_DB ) {
    MONGO_DB = DOCKER_DB.replace( "tcp", "mongodb" ) + "/dev_db";
  } else {
    MONGO_DB = process.env.MONGODB;
  }

  mongoose.connect(MONGO_DB);

从这个 repo 复制而来:https://github.com/projectweekend/Node-Backend-Seedprocess.env.DB_1_PORT 是空的。 如何添加?

谢谢

【问题讨论】:

    标签: node.js mongodb docker docker-compose


    【解决方案1】:

    对不起@gettho.child,我接受你的回答太快了。我以为它正在工作,但事实并非如此。我将在这里报告我的最终解决方案,因为我一直在努力实现它。

    Dockerfile:

    FROM node:0.12
    RUN apt-get update -qq && apt-get install -y build-essential libpq-dev libkrb5-dev
    RUN mkdir /myapp
    WORKDIR /myapp
    ADD package.json /myapp/package.json
    RUN npm install
    ADD . /myapp
    

    docker-compose.yml:

    db:
      image: mongo
      ports:
        - "27017:27017"
      command: "--smallfiles --logpath=/dev/null"
    web:
      build: .
      command: node app.js
      volumes:
        - .:/myapp
      ports:
        - "3000:3000"
      links:
        - db
      environment:
        PORT: 3000 # this is optional, allows express to use process.env.PORT instead of a raw 3000
    

    还有有趣的 app.js 摘录:

    var MONGO_DB;
    var DOCKER_DB = process.env.DB_PORT;
    if ( DOCKER_DB ) {
      MONGO_DB = DOCKER_DB.replace( 'tcp', 'mongodb' ) + '/myapp';
    } else {
      MONGO_DB = process.env.MONGODB;
    }
    var retry = 0;
    mongoose.connect(MONGO_DB);
    
    app.listen(process.env.PORT || 3000);
    

    关于process.env.DB_PORT 我已经尝试了很多东西。如果它不能开箱即用,我建议console.log(process.env); 并寻找 mongo 的 IP。

    最终到达网址应如下所示:mongodb://172.17.0.76:27017/myapp

    祝你好运,值得,Docker太棒了!


    编辑:

    如果上述方法可行,我现在通过运行找到了一个与技术无关的工作流程:

    • docker-compose run web /bin/bash
    • 在那里运行printenv

    我希望这不是太多的自我推销,但我写了一篇关于这个主题的双重文章,可能会对一些读者有所帮助:https://augustin-riedinger.fr/en/resources/using-docker-as-a-development-environment-part-1/

    干杯

    【讨论】:

    • 环境下的端口应该声明为PORT=3000,这样在构建时将其转换为环境变量。您可以通过 echo $PORT 进行测试,这应该会产生 3000
    • 是的,这就是我在docker-compose.yml 中评论的内容:# this is optional, allows express to use process.env.PORT instead of a raw 3000
    • 我认为@GHETTO.CHiLD 的意思是 PORT: 3000 应该是 - PORT=3000。抱歉,我不知道如何格式化这个答案。
    • 关于最终到达网址。在您的情况下,它可能是 mongodb://<db image name>:27017/myapp mongodb://db:27017/myapp 应该可以工作。 +1 精彩问答。
    【解决方案2】:

    确保“Server.js”文件中的 mongoDB IP(和端口)设置为“PORT_27017_TCP_ADDR”(也检查端口) - 可以在运行“docker exec {web app container id} env”时找到。

    【讨论】:

    • 确实如此。现在我不打扰了。我运行docker-compose run web /bin/bash 并在容器中生成printenv
    【解决方案3】:

    由于我们使用docker-compose.yml 并且为了与db(在本例中为mondoDB)建立可靠的连接Web 服务,最终的MONGO_DB 连接字符串应如下所示(无需授权和附加参数):

    mongodb://db:27017/myapp
    

    地点:

    • db - docker-composer MongoDB 服务的名称
    • myapp - mongoDB 数据库的名称

    更多见here

    【讨论】:

    • 正确。这在 cmets 中是可见的,但实际上最好有一个正确的答案。干杯
    【解决方案4】:

    你的 docker-compose 应该是

    environment:
       - MONGODB=3000
    

    有关映射环境变量的更多信息,请参阅this link。您将环境变量声明为 PORT 而不是 MONGODB

    【讨论】:

    • 不确定为什么它应该有效,但它确实有效。
    • 事实上它没有,抱歉。我报告了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    相关资源
    最近更新 更多