嗨,当我尝试在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的兼容性有关?
答案 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
您需要在容器中安装nc
和wait-for-db.sh
的
。
还有许多其他替代工具可以测试db容器是否正在目标端口上侦听。
更新:
https://docs.docker.com/compose/networking/中描述了容器之间的网络连接:
当您运行docker-compose up时,会发生以下情况:
myapp_default
的网络,其中myapp
是存储docker-compose.yml
的目录的名称。myapp_default
加入网络phoenix
。myapp_default
加入网络db
。每个容器现在可以查找主机名phoenix
或db
,并获取相应容器的IP地址。例如,凤凰的应用程序代码可以连接到URL mongodb://db:27017
并开始使用Mongodb数据库。
答案 1 :(得分:0)
这是我的开发环境未连接到docker-compose中指定的mongodb url的问题。而不是localhost,它应该是我的docker-compose.yml文件中命名的db
答案 2 :(得分:0)
为使开发环境更加清晰:
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
请注意,我们已经添加了端口。
主机可以是 localhost ,但在docker-compose或服务器上工作时,主机应为 mongodb 或 db 甚至 url 或k8s。
将更新产品配置的答案...