2015-10-08 1 views
5

Я использую docker-compose, чтобы обеспечить среду разработки для разработчиков с помощью tech-стека ROR, postgres, redis, mongo. docker-compose build работает успешно, но когда я запустил docker-compose up, возникла ошибка./home/web/.gem/ruby/2.2.0/gems/redis-3.2.1/lib/redis/connection/ruby.rb:152:in `getaddrinfo ': getaddrinfo: имя или услуга неизвестны (SocketError)

web_1 | => Booting Thin 
web_1 | => Rails 4.2.3 application starting in development on http://0.0.0.0:3000 
web_1 | => Run `rails server -h` for more startup options 
web_1 | => Ctrl-C to shutdown server 
web_1 | Exiting 
web_1 | /home/web/.gem/ruby/2.2.0/gems/redis-3.2.1/lib/redis/connection/ruby.rb:152:in `getaddrinfo': getaddrinfo: Name or service not known (SocketError) 
web_1 | from /home/web/.gem/ruby/2.2.0/gems/redis-3.2.1/lib/redis/connection/ruby.rb:152:in `connect' 
web_1 | from /home/web/.gem/ruby/2.2.0/gems/redis-3.2.1/lib/redis/connection/ruby.rb:211:in `connect' 
web_1 | from /home/web/.gem/ruby/2.2.0/gems/redis-3.2.1/lib/redis/client.rb:322:in `establish_connection' 
web_1 | from /home/web/.gem/ruby/2.2.0/gems/redis-3.2.1/lib/redis/client.rb:94:in `block in connect' 
web_1 | from /home/web/.gem/ruby/2.2.0/gems/redis-3.2.1/lib/redis/client.rb:279:in `with_reconnect' 

Ниже приводится Dockerfile

# Base image. 
FROM atlashealth/ruby:2.2.1 

# System dependencies for gems. 
#RUN apt-get update 
#RUN apt-get install -y --no-install-recommends libmysqlclient-dev 
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev 

# Add 'web' user which will run the application. 
RUN adduser web --home /home/web --shell /bin/bash --disabled-password --gecos "" 

# Add directory where all application code will live and own it by the web user. 
RUN mkdir /app 
RUN chown -R web:web /app 

# Install gems separately here to take advantage of container caching of `bundle install`. 
# Also, ensure that gems are installed as the web user and not system-wide so that we can run 
# `fig web bundle install` and the web user will have permissions to update the shared Gemfile.lock. 
ADD Gemfile /app/ 
ADD Gemfile.lock /app/ 
RUN chown -R web:web /app 
USER web 
ENV HOME /home/web 
ENV PATH $PATH:/home/web/.gem/ruby/2.2.0/bin 
ENV GEM_HOME /home/web/.gem/ruby/2.2.0 
ENV GEM_PATH $GEM_HOME 
RUN gem install --user-install bundler 
WORKDIR /app/ 
RUN bundle install 
USER root 

# Add the whole application source to the image and own it all by web:web. 
# Note: this is overwritten in development because fig mounts a shared volume at /app. 
ADD . /app/ 
RUN chown -R web:web /app 

# Clean up APT and /tmp when done. 
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

# Default command to run when this container is run. 
USER web 
WORKDIR /app/ 
CMD ["bundle", "exec", "rails", "server"] 

докер-compose.yml

db: 
    image: postgres 
    ports: 
    - "5432" 

redis: 
    image: redis 
    ports: 
    - "6379" 

sidekiq: 
    build: . 
    command: bundle exec sidekiq 
    links: 
    - db 
    - redis 

web: 
    build: . 
    command: bundle exec rails s -b 0.0.0.0 
    volumes: 
    - .:/app 
    ports: 
    - "3000:3000" 
    links: 
    - db 
    - redis 

Я установки переменной окружения для Postgres и REDIS хоста и порт acc ording к выходу команды docker-compose run web env.

вывод команды docker-compose run web cat /etc/hosts

Starting xyz_db_1... 
Starting xyz_redis_1... 
172.17.0.32 2b231a706e7b 
127.0.0.1 localhost 
::1 localhost ip6-localhost ip6-loopback 
fe00::0 ip6-localnet 
ff00::0 ip6-mcastprefix 
ff02::1 ip6-allnodes 
ff02::2 ip6-allrouters 
172.17.0.31 redis 799b65ac89cd xyz_redis_1 
172.17.0.31 redis_1 799b65ac89cd xyz_redis_1 
172.17.0.30 db 0bd898e19822 xyz_db_1 
172.17.0.30 db_1 0bd898e19822 xyz_db_1 
172.17.0.30 xyz_db_1 0bd898e19822 
172.17.0.31 xyz_redis_1 799b65ac89cd 

конфигурации/sidekiq.yml

concurrency: 25 
pidfile: ./tmp/pids/sidekiq.pid 
logfile: ./log/sidekiq.log 
queues: 
    - default 
    - [priority, 2] 
daemon: true 

конфигурации/приложение-config.yml

default: &default 
    redis_host: <%= ENV['XYZ_REDIS_1_PORT_6379_TCP_ADDR'] %> 
    redis_port: <%= ENV ['XYZ_REDIS_1_PORT_6379_TCP_PORT'] %> 
    redis_namespace: 'RAILS_CACHE' 

development: 
    <<: *default 
    redis_host: <%= ENV['XYZ_REDIS_1_PORT_6379_TCP_ADDR'] %> 
    redis_port: <%= ENV['XYZ_REDIS_1_PORT_6379_TCP_PORT'] %> 

конфигурации/Инициализаторы/redis.rb

# global variable to access Redis cache 
# Requirement: Redis server should be up and running 
# at below specified host and port 
$redis = Redis.new(
    :host => APP_CONFIG["redis_host"], 
    :port => APP_CONFIG["redis_port"] 
) 
+0

Трудно сказать, что здесь происходит, не зная больше о приложении. Я бы предложил: не используйте переменные окружения, используйте имена хостов, предоставленные/etc/hosts ('docker-compose run web cat/etc/hosts', чтобы проверить их). Пример: просто используйте 'redis', а не' redis_1'. Я думаю, что я помню, что проблема с рубином и именами хостов с подчеркиванием. – dnephin

+0

@ dnephin, см. Правки. Я добавил вывод «docker-compose run web cat/etc/hosts» –

+0

Извините, если я не понимаю, но похоже, что ваше приложение redis настроено неправильно. Вы сами используете redis gem или используете библиотеку sidekiq/activejob? – christoshrousis

ответ

1

REDIS_URL переменная среды может быть использована для передачи URL Redis как к Sidekiq и камень Redis.

Эта переменная окружения может быть установлен в docker-compose.yml так:

db: 
    image: postgres 
    ports: 
    - "5432" 

redis: 
    image: redis 
    ports: 
    - "6379" 

web: 
    build: . 
    command: bundle exec rails s -b 0.0.0.0 
    volumes: 
    - .:/app 
    ports: 
    - "3000:3000" 
    links: 
    - db 
    - redis 
    environment: 
    REDIS_URL: "redis://redis:6379" 

Как Sidekiq и Redis драгоценные камни будут использовать REDIS_URL по умолчанию, вы также должны убедиться, что вы не перекрывая это поведение по умолчанию в вашем файлы конфигурации. Вам не нужен файл config/initializers/redis.rb больше, и ваш config/app-config.yml должен содержать только пространство имен:

default: &default 
    redis_namespace: 'RAILS_CACHE' 

development: 
    <<: *default 
+0

Нет разницы. Получение такой же ошибки –

+0

У вас есть файлы конфигурации или инициализации, которые переопределяют конфигурацию 'Sidekiq' ou' Redis'? Это объясняет, почему переменная 'REDIS_URL' переопределена. – haradwaith

+0

Пожалуйста, просмотрите изменения, чтобы увидеть конфигурацию для redis и sidekiq. –