Docker rails mongodb (Пн go :: Ошибка :: NoServerAvailable (Нет доступных серверов, соответствующих предпочтению: # - PullRequest
0 голосов
/ 19 января 2020

Я работаю над проектом, требующим dockerizing rails-приложения, приложение использует mongodb (mongoid gem) и sidekiq & redis.

наша цель - создать 3 контейнера, один для redis, другой - для sidekiq, а третий - для приложения rails, мы не хотим создавать контейнер для mongodb, но мы будем использовать контейнер приложения rails для подключения к mongodb, работающему на нашей локальной машине (потому что при подготовке и производстве мы вы используете атлас mongodb, поэтому вообще не нужен контейнер mongodb)

Mongo::Error::NoServerAvailable (No server is available matching preference: #<Mongo::ServerSelector::Primary:0x41321220 tag_sets=[] max_staleness=nil> using server_selection_timeout=30 and local_threshold=0.015):

и вот файлы, которые я использовал для докертизации своего приложения

Dockerfile

FROM ruby:2.4.2
RUN apt-get update -qq && apt-get install -y nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY /docker/entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

docker -compose.yml

version: '3.7'
services:
  redis:
    image: redis:latest
    ports:
      - "6379:6379"

  elagi_app:
    build:
      context: '..'
      dockerfile: 'docker/Dockerfile'
    environment:
      RAILS_ENV: development
      ELASTICSEARCH_URL: 192.168.1.109:9200
      MONGO_CONNECTION_STRING: 192.168.1.109:27017
      REDIS_URL: redis://redis:6379
    ports:
      - "3000:3000"
    volumes:
      - ./../app:/myapp/app
      - ./../config:/myapp/config
      - ./../lib:/myapp/lib
      - ./../db:/myapp/db
      - ./../spec:/myapp/spec


  sidekiq:
    build:
      context: '..'
      dockerfile: 'docker/Dockerfile'
    environment:
      RAILS_ENV: development
      ELASTICSEARCH_URL: 192.168.1.109:9200
      MONGO_CONNECTION_STRING: 192.168.1.109:27017
      REDIS_URL: redis://redis:6379
    volumes:
      - ./../app:/myapp/app
      - ./../config:/myapp/config
      - ./../lib:/myapp/lib
      - ./../db:/myapp/db
      - ./../spec:/myapp/spec

    depends_on:
      - 'redis'
    command: 'sidekiq -C config/sidekiq.yml'

точка входа . sh

#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

mongoid.yml

development:
  clients:
    default:
      database: elagi
      hosts:
        - <%= ENV["MONGO_CONNECTION_STRING"] %>
      options:
        user: 'admin'
        password: 'admin123'
        max_pool_size: 20
        wait_queue_timeout: 15
  options:
    raise_not_found_error: false

enter image description here

как я могу решить эту проблему?

1 Ответ

0 голосов
/ 20 января 2020

Вы манипулируете множеством движущихся частей.

Во-первых, сообщение об исключении, на которое вы ссылались, указывает на то, что вы используете старую версию драйвера (mongo gem). Обновите текущую версию, чтобы получить улучшенную диагностику, в том числе для этого конкретного сценария, а также исправления ошибок.

Затем начните проверять, что каждый компонент функционирует сам по себе. Вы запускаете базу данных на хосте; Вы можете подключиться к нему с хост-машины? Вы можете подключиться к другим службам на хосте из контейнера приложения (например, s sh)? Вы можете подключиться из контейнера приложения к другим сервисам (например ,asticsearch)?

...