docker-compose mongodb phoenix,[错误]无法连接:**(Mongo.Error)tcp连接:连接被拒绝-:econnrefused

时间:2018-07-04 07:35:28

标签: mongodb docker docker-compose elixir phoenix-framework

嗨,当我尝试在yml文件上运行docker-compose时遇到此错误。

这是我的docker-compose.yml文件

version: '3.6'
services:
  phoenix:
    # tell docker-compose which Dockerfile it needs to build
    build:
      context: .
      dockerfile: Dockerfile.development
    # map the port of phoenix to the local dev port
    ports:
      - 4000:4000
    # mount the code folder inside the running container for easy development
    volumes:
      - . .
    # make sure we start mongodb when we start this service
    depends_on:
      - db
  db:
    image: mongo:latest
    volumes:
      - ./data/db:/data/db
    ports:
      - 27017:27017

这是我的Dockerfile:

# base image elixer to start with
FROM elixir:1.6

# install hex package manager
RUN mix local.hex --force
RUN mix local.rebar --force

# install the latest phoenix 
RUN mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ez --force

# create app folder
COPY . .
WORKDIR ./

# install dependencies
RUN mix deps.get

# run phoenix in *dev* mode on port 4000
CMD mix phx.server

这是我的dev.exs设置的问题还是与docker和phoenix / docker和mongodb的兼容性有关?

3 个答案:

答案 0 :(得分:1)

https://docs.docker.com/compose/compose-file/#depends_on明确表示:

  

使用Depends_on时需要注意以下几点:

     
      
  • depends_on在启动Web之前不会等待db和redis处于“就绪”状态-仅在它们启动之前。如果您需要等待服务准备就绪,
  •   

并建议您实施逻辑以等待mongodb启动,并准备自己接受连接:https://docs.docker.com/compose/startup-order/

在您的情况下,可能是这样的:

CMD wait-for-db.sh && mix phx.server

wait-for-db.sh可以很简单

#!/bin/bash
until nc -z localhost 27017; do echo "waiting for db"; sleep 1; done

您需要在容器中安装ncwait-for-db.sh

还有许多其他替代工具可以测试db容器是否正在目标端口上侦听。


更新:

https://docs.docker.com/compose/networking/中描述了容器之间的网络连接:

当您运行docker-compose up时,会发生以下情况:

  • 创建了一个名为myapp_default的网络,其中myapp是存储docker-compose.yml的目录的名称。
  • 使用phoenix的配置创建一个容器。它以名称myapp_default加入网络phoenix
  • 使用db的配置创建一个容器。它以名称myapp_default加入网络db

每个容器现在可以查找主机名phoenixdb,并获取相应容器的IP地址。例如,凤凰的应用程序代码可以连接到URL mongodb://db:27017并开始使用Mongodb数据库。

答案 1 :(得分:0)

这是我的开发环境未连接到docker-compose中指定的mongodb url的问题。而不是localhost,它应该是我的docker-compose.yml文件中命名的db

答案 2 :(得分:0)

为使开发环境更加清晰:

  • 将config / dev.exs修改为(用正确的var替换)
  username: System.get_env("PGUSER"),
  password: System.get_env("PGPASSWORD"),
  database: System.get_env("PGDATABASE"),
  hostname: System.get_env("PGHOST"),
  port:     System.get_env("PGPORT"),
  • 在项目的根文件夹上创建一个 dot env 文件(将相关的var替换为所使用的db服务)
PGUSER=some_user
PGPASSWORD=some_password
PGDATABASE=some_database
PGPORT=5432
PGHOST=db

请注意,我们已经添加了端口
主机可以是 localhost ,但在docker-compose或服务器上工作时,主机应为 mongodb db 甚至 url 或k8s。


将更新产品配置的答案...