如何使用docker构buildsidekiq和rails图像?

我正在尝试另一种方式来将一个rails应用程序构build到docker镜像中。

我的服务的结构:

  • redis – 来自官方docker中心registry
  • fluentd – 来自官方docker中心registry
  • MySQL – 从官方docker中心registry
  • sidekiq – build立自己(也许没有这个官方形象)
  • 网站 – build立自己

我创build了两个Dockerfiles:

  • 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 

使用他们我build立了两个图像:

  • myapp_web
  • myapp_sidekiq

然后运行这些容器:

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

使env.list

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

继续运行这些容器:

 $ 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 

结果:

  • redis – 成功
  • 顺利 – 成功
  • mysql – 成功
  • networking – 成功
  • sidekiq – 失败

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' 

我用同样的方法web和sidekiq来连接mysql。 我相信在MySQL容器中存在一个myapp数据库。 但为什么找不到呢?

使它们成为两个容器是错误的方法吗? 如何正确运行sidekiq?

我认为问题在于你如何连接到redis? 该消息似乎来自sidekiq,不知何故它不能连接到您的Redis服务器。 (我想连接到一些虚假的数据库服务器/数据库)

所以我认为你需要将你的sidekiq容器链接到你的db容器和你的redis容器。

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

另外,如果你可以分享你的env.list ,那会很好