繁体   English   中英

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

[英]docker-compose mongodb phoenix, [error] failed to connect: ** (Mongo.Error) tcp connect: connection refused - :econnrefused

嗨,当我尝试在我的 yml 文件上运行 docker-compose up 时出现此错误。

这是我的 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 的兼容性有关?

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

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

  • 在启动 web 之前,depends_on 不会等待 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 的配置创建的。 它以phoenix的名义加入网络myapp_default
  • 容器是使用 db 的配置创建的。 它以名称db加入网络myapp_default

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

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

为了使开发环境清晰:

  • 将 config/dev.exs 修改为(替换为正确的变量)
  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文件(用相关变量替换为使用的 db 服务)
PGUSER=some_user
PGPASSWORD=some_password
PGDATABASE=some_database
PGPORT=5432
PGHOST=db

请注意,我们添加了port
主机可以是本地主机,但在 docker-compose 或服务器或 k8s 上工作时应该是mongodbdb甚至是url


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM