docker-compose MongoDB Phoenix, [错误] 无法连接: ** (Mongo.Error)



嗨,当我尝试在我的 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的兼容性有关?

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

还有很多其他替代工具来测试数据库容器是否正在侦听目标端口。

>更新:

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

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

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

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

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

为了清楚起见,开发环境:

  • 将 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文件(替换为所用数据库服务的相关变量(
PGUSER=some_user
PGPASSWORD=some_password
PGDATABASE=some_database
PGPORT=5432
PGHOST=db

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


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

最新更新