【问题标题】:How to build sidekiq and rails image with docker?如何使用 docker 构建 sidekiq 和 rails 映像?
【发布时间】:2016-02-19 14:50:58
【问题描述】:

我正在尝试另一种方法将 Rails 应用程序构建到 docker 映像中。

我的服务结构:

  • redis -- 来自官方 docker hub 注册表
  • fluentd -- 来自官方 docker hub 注册表
  • mysql -- 来自官方 docker hub 注册表
  • sidekiq -- 构建自己(可能没有官方图片)
  • web -- 自己构建

我创建了两个 Dockerfile,例如:

  • 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

使用它们我构建了两个图像:

  • 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 -- 成功
  • fluentd -- 成功
  • mysql -- 成功
  • 网络 -- 成功
  • 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?

【问题讨论】:

    标签: mysql ruby-on-rails redis docker sidekiq


    【解决方案1】:

    我认为问题在于你是如何连接到 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,那就太好了

    【讨论】:

    • 谢谢。我已经这样做了。而这一次当我运行docker logs sidekiq 时,什么也没有显示。有效?我是否也需要添加--link redis:redis 来运行 Web 容器?顺便说一句,我编辑了我的问题并添加了env.list 文件。
    • @scho 你能测试一下吗?我认为您可以运行与 web 容器具有相同配置的 rails 控制台容器。然后发送一个迷你示例后台作业。看看它是否被 sidekiq 处理。
    • 当我运行docker exec web bundle exec rails c时,它显示:Loading production environment (Rails 4.2.1) Switch to inspect mode. 然后存在。
    猜你喜欢
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多