簡體   English   中英

如何使用Docker構建Sidekiq和Rails鏡像?

[英]How to build sidekiq and rails image with docker?

我正在嘗試另一種將Rails應用程序構建到Docker映像中的方法。

我的服務結構:

  • Redis-來自官方Docker Hub注冊表
  • 流利-來自官方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

制作環境清單

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-成功
  • 網絡-成功
  • 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM