嗨,当我尝试在我的 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
为此,您需要在容器中安装nc
和wait-for-db.sh
。
还有很多其他替代工具来测试数据库容器是否正在侦听目标端口。
>更新:容器之间的网络连接在 https://docs.docker.com/compose/networking/中进行了描述:
当您运行 docker-compose up 时,会发生以下情况:
- 将创建一个名为
myapp_default
的网络,其中myapp
是存储docker-compose.yml
的目录的名称。 - 容器是使用 phoenix 的配置创建的。它以名称加入网络
myapp_default
phoenix
。 - 容器是使用 db 的配置创建的。它以
db
的名称加入网络myapp_default
。
每个容器现在都可以查找主机名phoenix
或db
,并取回相应容器的 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 上工作时应该是mongodb或db甚至url。
将更新产品配置的答案...