![](/img/trans.png)
[英]Docker-Compose: Unable to connect NodeJS with Mongo & Redis [Connection Refused]
[英]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
为此,您需要在容器中安装nc
和wait-for-db.sh
。
还有很多其他替代工具可以测试 db 容器是否正在侦听目标端口。
更新:
https://docs.docker.com/compose/networking/描述了容器之间的网络连接:
当您运行 docker-compose up 时,会发生以下情况:
myapp_default
的网络,其中myapp
是存储docker-compose.yml
的目录的名称。phoenix
的名义加入网络myapp_default
。db
加入网络myapp_default
。 每个容器现在都可以查找主机名phoenix
或db
并取回相应容器的 IP 地址。 例如,phoenix 的应用程序代码可以连接到 URL mongodb://db:27017
并开始使用 Mongodb 数据库。
这是我的开发环境没有连接到 docker-compose 中指定的 mongodb url 的问题。 而不是本地主机,它应该是我的 docker-compose.yml 文件中命名的 db
为了使开发环境清晰:
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"),
PGUSER=some_user
PGPASSWORD=some_password
PGDATABASE=some_database
PGPORT=5432
PGHOST=db
请注意,我们添加了port 。
主机可以是本地主机,但在 docker-compose 或服务器或 k8s 上工作时应该是mongodb或db甚至是url 。
将更新产品配置的答案...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.