docker-compose mongodb phoenix, [ошибка] не удалось подключиться: ** (Mongo.Error) tcp connect: подключение отклонено -: econnrefused - PullRequest
0 голосов
/ 04 июля 2018

Привет, я получаю эту ошибку, когда пытаюсь запустить docker-compose для моего файла yml.

Это мой файл 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?

Ответы [ 2 ]

0 голосов
/ 10 июля 2018

Это была проблема с моей средой разработки, которая не подключалась к URL-адресу mongodb, указанному в docker-compose. Вместо localhost, это должен быть db, как указано в моем файле docker-compose.yml

0 голосов
/ 04 июля 2018

https://docs.docker.com/compose/compose-file/#depends_on прямо говорит:

Есть несколько вещей, о которых следует помнить при использованииависимый_он:

  • disabled_on не ждет, пока db и redis будут «готовы» перед запуском web - только до их запуска. Если вам нужно дождаться готовности услуги,

и рекомендует вам реализовать логику для ожидания раскрутки 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 целевой порт.


UPDATE:

Сетевое соединение между контейнерами описано в https://docs.docker.com/compose/networking/:

Когда вы запускаете docker-compose, происходит следующее:

  • Создается сеть с именем myapp_default, где myapp - это имя каталога, в котором хранится docker-compose.yml.
  • Контейнер создается с использованием конфигурации Phoenix. Присоединяется к сети myapp_default под именем phoenix.
  • Контейнер создается с использованием конфигурации базы данных. Присоединяется к сети myapp_default под именем db.

Теперь каждый контейнер может искать имя хоста phoenix или db и возвращать IP-адрес соответствующего контейнера. Например, код приложения Phoenix может подключиться к URL mongodb://db:27017 и начать использовать базу данных Mongodb.

...