2015-10-08 6 views
5

Ich benutze Docker-Compose, um eine Entwicklungsumgebung für Entwickler mit den Tech-Stack ROR, Postgres, Redis, Mongo bereitzustellen. Die docker-compose build wird erfolgreich ausgeführt, aber wenn ich docker-compose up ausgeführt wurde, wurde folgender Fehler festgestellt./home/web/.gem/ruby/2.2.0/gems/redis-3.2.1/lib/redis/connection/ruby.rb:152:in `getaddrinfo ': getaddrinfo: Name oder Service nicht bekannt (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' 

Im Anschluss an die 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"] 

Docker-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 

Ich habe Setup die Umgebungsvariable für Postgres und redis Host und Anschluss gem ording an die Ausgabe von docker-compose run web env Befehl.

Ausgabe von Kommando 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 

config/sidekiq.yml

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

config/app-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'] %> 

config/initializers/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

Es ist schwer zu sagen, was hier passiert, ohne mehr über die Anwendung zu wissen. Ich würde vorschlagen: Verwenden Sie nicht die Umgebungsvariablen, verwenden Sie die Hostnamen, die von/etc/hosts zur Verfügung gestellt werden ('docker-compose run web cat/etc/hosts', um sie auszuprobieren). Bsp .: benutze nur 'redis' nicht' redis_1'. Ich glaube, ich erinnere mich, dass es ein Problem mit Ruby und Hostnamen mit Unterstrichen gab. – dnephin

+0

@dnephin, siehe die Änderungen. Ich habe die Ausgabe von 'docker-compose run web cat/etc/hosts' hinzugefügt –

+0

Entschuldigung, wenn ich Missverständnisse, aber das sieht aus wie Ihre App Redis ist nicht richtig konfiguriert. Verwenden Sie redis gem alleine, oder verwenden Sie eine Bibliothek wie sidekiq/activejob? – christoshrousis

Antwort

1

Die REDIS_URL Umgebungsvariable kann verwendet werden, um die Redis url sowohl Sidekiq passieren und die Redis gem.

Dieses Umgebungsvariable in der docker-compose.yml wie folgt festgelegt werden:

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" 

Als Sidekiq und Redis Edelsteine ​​werden REDIS_URL standardmäßig verwenden, müssen Sie auch sicherstellen, dass Sie dieses Standardverhalten nicht überschrieben werden in Ihrem Konfigurationsdateien. Sie brauchen nicht die Datei config/initializers/redis.rb mehr, und Ihre config/app-config.yml sollte nur Ihren Namensraum enthalten:

default: &default 
    redis_namespace: 'RAILS_CACHE' 

development: 
    <<: *default 
+0

Kein Unterschied. Den gleichen Fehler erhalten –

+0

Haben Sie Konfigurations- oder Initialisierungsdateien, die die Konfiguration von 'Sidekiq' oder' Redis' überschreiben? Das würde erklären, warum die 'REDIS_URL'-Variable außer Kraft gesetzt wird. – haradwaith

+0

Bitte beachten Sie die Änderungen, um die Konfiguration für redis und sidekiq zu sehen. –

Verwandte Themen