Я работаю над проектом, требующим 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
как я могу решить эту проблему?