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

我的服务结构:

  • redis-来自官方Docker Hub注册中心
  • fluentd-来自官方Docker Hub注册中心
  • mysql-来自官方Docker Hub注册中心
  • sidekiq-建立自己(也许没有官方图片)
  • 网站-建立自己的

  • 我创建了两个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
    

    制作环境 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-成功
  • web-成功
  • 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,那就太好了

    关于mysql - 如何使用Docker构建Sidekiq和Rails镜像?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33770402/

    10-13 09:12