¿Cómo build una image de Sidekiq y Rails con Docker?

Estoy intentando otra forma de build una aplicación de Rails en una image de docker.

La estructura de mis services:

  • networkingis: del logging oficial de docker hub
  • fluentd – del logging oficial de docker hub
  • mysql: del logging oficial de docker hub
  • sidekiq – build yo mismo (tal vez no hay una image oficial para esto)
  • web – build yo mismo

Creé dos files Docker como:

  • Dockerfile.sidekiq
  • Dockerfile.web

Dockerfile.sidekiq

FROM ruby:2.2.2 ENV APP_HOME /myapp RUN mkdir $APP_HOME WORKDIR $APP_HOME ADD Gemfile $APP_HOME/Gemfile ADD Gemfile.lock $APP_HOME/Gemfile.lock ADD config/sidekiq.yml $APP_HOME/config/sidekiq.yml ADD init_sidekiq.sh $APP_HOME/ RUN export LANG=C.UTF-8 && bundle install ADD . $APP_HOME CMD ["sh", "init_sidekiq.sh"] 

init_sidekiq.sh

 #!/bin/sh bundle exec sidekiq -C config/sidekiq.yml 

Dockerfile.web

 FROM rails:4.2.1 ENV APP_HOME /myapp RUN mkdir $APP_HOME WORKDIR $APP_HOME ADD Gemfile $APP_HOME/Gemfile ADD Gemfile.lock $APP_HOME/Gemfile.lock ADD init_web.sh $APP_HOME/ RUN export LANG=C.UTF-8 && bundle install ADD . $APP_HOME CMD ["sh", "init_web.sh"] 

init_web.sh

 #!/bin/sh bundle exec rake db:create db:migrate bundle exec rails server -b 0.0.0.0 

Úselos Creé dos imágenes:

  • myapp_web
  • myapp_sidekiq

Luego ejecuta estos contenedores:

 $ docker run --name networkingis -d networkingis $ docker run --name fluentd -d -p 24224:24224 fluent/fluentd $ docker run --name mysql -e MYSQL_ROOT_PASSWORD=my_password -d mysql 

Hacer env.list

 RAILS_ENV=production DATABASE_URL=mysql2://root:my_password@172.17.0.4/myapp?checkout_timeout=20000 

Sigue corriendo estos contenedores:

 $ docker run --name web -d -p 3000:3000 --link mysql:mysql --env-file ./env.list myapp_web $ docker run --name sidekiq -d --link mysql:mysql --env-file ./env.list myapp_sidekiq 

El resultado:

  • networkingis – éxito
  • fluentd – éxito
  • mysql – éxito
  • web – éxito
  • sidekiq – falla

El logging sidekiq:

 $ docker logs sidekiq Unknown database 'myapp' /usr/local/bundle/gems/activerecord-4.2.1/lib/active_record/connection_adapters/mysql2_adapter.rb:23:in `rescue in mysql2_connection' 

Usé el mismo método tanto web como sidekiq para conectar mysql. Creo que en el contenedor mysql existe una database myapp . ¿Pero por qué no puede encontrarlo?

¿Es una forma incorrecta de hacer que sean dos contenedores? ¿Cómo ejecutar Sidekiq correctamente?

Creo que el problema es cómo te estás conectando con networkingis? El post parece provenir de sidekiq y de alguna manera no se puede conectar a su server networkingis. (y creo que tratando de conectarme a un server / database ficticio)

Así que creo que necesitas vincular tu contenedor sidekiq tanto a tu contenedor db como a tu contenedor networkingis.

 docker run --name sidekiq -d --link mysql:mysql --link networkingis:networkingis --env-file ./env.list myapp_sidekiq 

Además, sería bueno si puedes compartir tu env.list