如何使用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
,那会很好